< Module exactEval:list.
< Prove_Constraint exactEval:host:proj_expr_unique. Subgoal 1: Variables: L1 L2 E2 Ty PrA : L1 |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) PrB : L2 |{expr}- nil Ty ~~> E2 IsE : is_expr (nil Ty) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = E2
< case PrB. Subgoal 1: Variables: L1 L2 Ty PrA : L1 |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
< search. Subgoal 2: Variables: L1 L2 E2 E4 E3 PrA : L1 |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) PrB : L2 |{expr}- cons E3 E4 ~~> E2 IsE : is_expr (cons E3 E4) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = E2
< case PrB. Subgoal 2: Variables: L1 L2 E4 E3 PrA : L1 |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) IsE : is_expr (cons E3 E4) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs)))
< search. Subgoal 3: Variables: L1 L2 E2 E3 PrA : L1 |{expr}- null E3 ~~> recFieldAccess E3 "null" PrB : L2 |{expr}- null E3 ~~> E2 IsE : is_expr (null E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "null" = E2
< case PrB. Subgoal 3: Variables: L1 L2 E3 PrA : L1 |{expr}- null E3 ~~> recFieldAccess E3 "null" IsE : is_expr (null E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "null" = recFieldAccess E3 "null"
< search. Subgoal 4: Variables: L1 L2 E2 E3 PrA : L1 |{expr}- head E3 ~~> recFieldAccess E3 "head" PrB : L2 |{expr}- head E3 ~~> E2 IsE : is_expr (head E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "head" = E2
< case PrB. Subgoal 4: Variables: L1 L2 E3 PrA : L1 |{expr}- head E3 ~~> recFieldAccess E3 "head" IsE : is_expr (head E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "head" = recFieldAccess E3 "head"
< search. Subgoal 5: Variables: L1 L2 E2 E3 PrA : L1 |{expr}- tail E3 ~~> recFieldAccess E3 "tail" PrB : L2 |{expr}- tail E3 ~~> E2 IsE : is_expr (tail E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "tail" = E2
< case PrB. Subgoal 5: Variables: L1 L2 E3 PrA : L1 |{expr}- tail E3 ~~> recFieldAccess E3 "tail" IsE : is_expr (tail E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ recFieldAccess E3 "tail" = recFieldAccess E3 "tail"
< search. Subgoal 6: Variables: L1 L2 E2 SaveL SaveI Index Lst PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") PrB : L2 |{expr}- index Lst Index ~~> E2 IsE : is_expr (index Lst Index) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" L1 SaveI PrA2 : fresh_name "L" L1 SaveL ============================ stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") = E2
< PrB: case PrB. Subgoal 6: Variables: L1 L2 SaveL SaveI Index Lst SaveL1 SaveI1 PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" L1 SaveI PrA2 : fresh_name "L" L1 SaveL PrB : fresh_name "I" L2 SaveI1 PrB1 : fresh_name "L" L2 SaveL1 ============================ stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
< apply fresh_name_unique_mems to PrA1 PrB _ _. Subgoal 6: Variables: L1 L2 SaveL Index Lst SaveL1 SaveI1 PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" L1 SaveI1 PrA2 : fresh_name "L" L1 SaveL PrB : fresh_name "I" L2 SaveI1 PrB1 : fresh_name "L" L2 SaveL1 ============================ stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
< apply fresh_name_unique_mems to PrA2 PrB1 _ _. Subgoal 6: Variables: L1 L2 Index Lst SaveL1 SaveI1 PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head") IsE : is_expr (index Lst Index) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" L1 SaveI1 PrA2 : fresh_name "L" L1 SaveL1 PrB : fresh_name "I" L2 SaveI1 PrB1 : fresh_name "L" L2 SaveL1 ============================ stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
< search. Subgoal 7: Variables: L1 L2 E2 Len SaveL E3 PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) PrB : L2 |{expr}- exactEval:list:length E3 ~~> E2 IsE : is_expr (exactEval:list:length E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" L1 SaveL PrA2 : fresh_name "Len" L1 Len ============================ stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = E2
< PrB: case PrB. Subgoal 7: Variables: L1 L2 Len SaveL E3 Len1 SaveL1 PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" L1 SaveL PrA2 : fresh_name "Len" L1 Len PrB : fresh_name "L" L2 SaveL1 PrB1 : fresh_name "Len" L2 Len1 ============================ stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
< apply fresh_name_unique_mems to PrA1 PrB _ _. Subgoal 7: Variables: L1 L2 Len E3 Len1 SaveL1 PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" L1 SaveL1 PrA2 : fresh_name "Len" L1 Len PrB : fresh_name "L" L2 SaveL1 PrB1 : fresh_name "Len" L2 Len1 ============================ stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
< apply fresh_name_unique_mems to PrA2 PrB1 _ _. Subgoal 7: Variables: L1 L2 E3 Len1 SaveL1 PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1) IsE : is_expr (exactEval:list:length E3) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" L1 SaveL1 PrA2 : fresh_name "Len" L1 Len1 PrB : fresh_name "L" L2 SaveL1 PrB1 : fresh_name "Len" L2 Len1 ============================ stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_is. Subgoal 1: Variables: L Ty Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsL : is_list is_string L ============================ is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
< case IsE. Subgoal 1: Variables: L Ty Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsL : is_list is_string L H1 : is_typ Ty ============================ is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
< search 8. Subgoal 2: Variables: L E2 E1 Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) IsL : is_list is_string L ============================ is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
< case IsE. Subgoal 2: Variables: L E2 E1 Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsL : is_list is_string L H1 : is_expr E1 H2 : is_expr E2 ============================ is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
< search 10. Subgoal 3: Variables: L E1 Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) IsL : is_list is_string L ============================ is_expr (recFieldAccess E1 "null")
< case IsE. Subgoal 3: Variables: L E1 Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null" IsL : is_list is_string L H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "null")
< search 7. Subgoal 4: Variables: L E1 Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) IsL : is_list is_string L ============================ is_expr (recFieldAccess E1 "head")
< case IsE. Subgoal 4: Variables: L E1 Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head" IsL : is_list is_string L H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "head")
< search 7. Subgoal 5: Variables: L E1 Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) IsL : is_list is_string L ============================ is_expr (recFieldAccess E1 "tail")
< case IsE. Subgoal 5: Variables: L E1 Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsL : is_list is_string L H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "tail")
< search 7. Subgoal 6: Variables: L SaveL SaveI Index Lst Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL : is_list is_string L Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL ============================ is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
< case IsE. Subgoal 6: Variables: L SaveL SaveI Index Lst Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsL : is_list is_string L Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL H1 : is_expr Lst H2 : is_expr Index ============================ is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
< apply fresh_name_is to _ Pr1. Subgoal 6: Variables: L SaveL SaveI Index Lst Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsL : is_list is_string L Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL H1 : is_expr Lst H2 : is_expr Index H3 : is_string SaveI ============================ is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
< apply fresh_name_is to _ Pr2. Subgoal 6: Variables: L SaveL SaveI Index Lst Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsL : is_list is_string L Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL H1 : is_expr Lst H2 : is_expr Index H3 : is_string SaveI H4 : is_string SaveL ============================ is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
< search 20. Subgoal 7: Variables: L Len SaveL E1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E1) IsL : is_list is_string L Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len ============================ is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
< case IsE. Subgoal 7: Variables: L Len SaveL E1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsL : is_list is_string L Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len H1 : is_expr E1 ============================ is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
< apply fresh_name_is to _ Pr1. Subgoal 7: Variables: L Len SaveL E1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsL : is_list is_string L Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len H1 : is_expr E1 H2 : is_string SaveL ============================ is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
< apply fresh_name_is to _ Pr2. Subgoal 7: Variables: L Len SaveL E1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsL : is_list is_string L Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len H1 : is_expr E1 H2 : is_string SaveL H3 : is_string Len ============================ is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
< search 13. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_other. Subgoal 1: Variables: L L' Ty Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- nil Ty ~~> E''
< search. Subgoal 2: Variables: L L' E2 E1 Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- cons E1 E2 ~~> E''
< search. Subgoal 3: Variables: L L' E1 Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- null E1 ~~> E''
< search. Subgoal 4: Variables: L L' E1 Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- head E1 ~~> E''
< search. Subgoal 5: Variables: L L' E1 Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- tail E1 ~~> E''
< search. Subgoal 6: Variables: L L' SaveL SaveI Index Lst Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL ============================ exists E'', L' |{expr}- index Lst Index ~~> E''
< apply fresh_name_exists to _ IsL' with Base = "I". Subgoal 6: Variables: L L' SaveL SaveI Index Lst F Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL H1 : fresh_name "I" L' F ============================ exists E'', L' |{expr}- index Lst Index ~~> E''
< apply fresh_name_exists to _ IsL' with Base = "L". Subgoal 6: Variables: L L' SaveL SaveI Index Lst F F1 Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" L SaveI Pr2 : fresh_name "L" L SaveL H1 : fresh_name "I" L' F H2 : fresh_name "L" L' F1 ============================ exists E'', L' |{expr}- index Lst Index ~~> E''
< search. Subgoal 7: Variables: L L' Len SaveL E1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E1) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len ============================ exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
< apply fresh_name_exists to _ IsL' with Base = "L". Subgoal 7: Variables: L L' Len SaveL E1 F Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E1) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len H1 : fresh_name "L" L' F ============================ exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
< apply fresh_name_exists to _ IsL' with Base = "Len". Subgoal 7: Variables: L L' Len SaveL E1 F F1 Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E1) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" L SaveL Pr2 : fresh_name "Len" L Len H1 : fresh_name "L" L' F H2 : fresh_name "Len" L' F1 ============================ exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_unique. Subgoal 1: Variables: L1 L2 S2 Hold Copy L SaveE SaveI E I PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) PrB : L2 |{stmt}- listUpdate L I E ~~> S2 IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy ============================ scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = S2
< PrB: case PrB. Subgoal 1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 ============================ scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< assert forall X, mem X (L::L2) -> mem X (L::L1). Subgoal 1.1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 ============================ forall X, mem X (L::L2) -> mem X (L::L1)
< intros M. Subgoal 1.1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 M : mem X (L::L2) ============================ mem X (L::L1)
< M: case M. Subgoal 1.1.1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 ============================ mem L (L::L1)
< search. Subgoal 1.1.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 M : mem X L2 ============================ mem X (L::L1)
< apply Rel21 to M. Subgoal 1.1.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 M : mem X L2 H1 : mem X L1 ============================ mem X (L::L1)
< search. Subgoal 1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) ============================ scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< assert forall X, mem X (L::L1) -> mem X (L::L2). Subgoal 1.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) ============================ forall X, mem X (L::L1) -> mem X (L::L2)
< intros M. Subgoal 1.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) M : mem X (L::L1) ============================ mem X (L::L2)
< M: case M. Subgoal 1.2.1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) ============================ mem L (L::L2)
< search. Subgoal 1.2.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) M : mem X L1 ============================ mem X (L::L2)
< apply Rel12 to M. Subgoal 1.2.2: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) M : mem X L1 H2 : mem X L2 ============================ mem X (L::L2)
< search. Subgoal 1: Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< apply fresh_name_unique_mems to PrA1 PrB _ _. Subgoal 1: Variables: L1 L2 Hold Copy L SaveE E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI1 PrA2 : fresh_name "Hold" (L::L1) Hold PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< apply fresh_name_unique_mems to PrA2 PrB1 _ _. Subgoal 1: Variables: L1 L2 Copy L SaveE E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI1 PrA2 : fresh_name "Hold" (L::L1) Hold1 PrA3 : fresh_name "E" (L::L1) SaveE PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< apply fresh_name_unique_mems to PrA3 PrB2 _ _. Subgoal 1: Variables: L1 L2 Copy L E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI1 PrA2 : fresh_name "Hold" (L::L1) Hold1 PrA3 : fresh_name "E" (L::L1) SaveE1 PrA4 : fresh_name "C" (L::L1) Copy PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< apply fresh_name_unique_mems to PrA4 PrB3 _ _. Subgoal 1: Variables: L1 L2 L E I Hold1 Copy1 SaveE1 SaveI1 PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1)))))))))))))) IsS : is_stmt (listUpdate L I E) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "I" (L::L1) SaveI1 PrA2 : fresh_name "Hold" (L::L1) Hold1 PrA3 : fresh_name "E" (L::L1) SaveE1 PrA4 : fresh_name "C" (L::L1) Copy1 PrB : fresh_name "I" (L::L2) SaveI1 PrB1 : fresh_name "Hold" (L::L2) Hold1 PrB2 : fresh_name "E" (L::L2) SaveE1 PrB3 : fresh_name "C" (L::L2) Copy1 H1 : forall X, mem X (L::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
< search. Subgoal 2: Variables: L1 L2 S2 Body SaveL X L PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) PrB : L2 |{stmt}- listForeach X L Body ~~> S2 IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL ============================ scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) = S2
< PrB: case PrB. Subgoal 2: Variables: L1 L2 Body SaveL X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 ============================ scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) = scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))))
< apply fresh_name_unique_mems to PrA1 PrB _ _. Subgoal 2.1: Variables: L1 L2 Body SaveL X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 ============================ forall X1, mem X1 (X::L2) -> mem X1 (X::L1)
< intros M. Subgoal 2.1: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 (X::L2) ============================ mem X1 (X::L1)
< M: case M. Subgoal 2.1.1: Variables: L1 L2 Body SaveL X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 ============================ mem X (X::L1)
< search. Subgoal 2.1.2: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 L2 ============================ mem X1 (X::L1)
< apply Rel21 to M. Subgoal 2.1.2: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 L2 H1 : mem X1 L1 ============================ mem X1 (X::L1)
< search. Subgoal 2.2: Variables: L1 L2 Body SaveL X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 ============================ forall X1, mem X1 (X::L1) -> mem X1 (X::L2)
< intros M. Subgoal 2.2: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 (X::L1) ============================ mem X1 (X::L2)
< M: case M. Subgoal 2.2.1: Variables: L1 L2 Body SaveL X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 ============================ mem X (X::L2)
< search. Subgoal 2.2.2: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 L1 ============================ mem X1 (X::L2)
< apply Rel12 to M. Subgoal 2.2.2: Variables: L1 L2 Body SaveL X L SaveL1 X1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL PrB : fresh_name "L" (X::L2) SaveL1 M : mem X1 L1 H1 : mem X1 L2 ============================ mem X1 (X::L2)
< search. Subgoal 2: Variables: L1 L2 Body X L SaveL1 PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body)))) IsS : is_stmt (listForeach X L Body) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 PrA1 : fresh_name "L" (X::L1) SaveL1 PrB : fresh_name "L" (X::L2) SaveL1 ============================ scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body)))) = scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))))
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L1 I E) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< case IsS. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< apply fresh_name_is to _ Pr1. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< assert is_string "Hold". Subgoal 1.1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string "Hold" ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< apply fresh_name_is to _ Pr2. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string "Hold" H6 : is_string Hold ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< apply fresh_name_is to _ Pr3. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string "Hold" H6 : is_string Hold H7 : is_string SaveE ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< apply fresh_name_is to _ Pr4. Subgoal 1: Variables: L Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string "Hold" H6 : is_string Hold H7 : is_string SaveE H8 : is_string Copy ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< search 30. Subgoal 2: Variables: L Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L1 Body) IsL : is_list is_string L Pr1 : fresh_name "L" (X::L) SaveL ============================ is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
< case IsS. Subgoal 2: Variables: L Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body ============================ is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
< apply fresh_name_is to _ Pr1. Subgoal 2: Variables: L Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body H4 : is_string SaveL ============================ is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
< search 20. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other. Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L1 I E) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< case IsS. Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< Is': assert is_list is_string (L1::L'). Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "I". Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I F Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "Hold". Subgoal 1.1: Variables: L L' Hold Copy L1 SaveE SaveI E I F Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I F F1 Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F H5 : fresh_name "Hold" (L1::L') F1 ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "E". Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I F F1 F2 Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F H5 : fresh_name "Hold" (L1::L') F1 H6 : fresh_name "E" (L1::L') F2 ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "C". Subgoal 1: Variables: L L' Hold Copy L1 SaveE SaveI E I F F1 F2 F3 Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "I" (L1::L) SaveI Pr2 : fresh_name "Hold" (L1::L) Hold Pr3 : fresh_name "E" (L1::L) SaveE Pr4 : fresh_name "C" (L1::L) Copy H1 : is_string L1 H2 : is_expr I H3 : is_expr E Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F H5 : fresh_name "Hold" (L1::L') F1 H6 : fresh_name "E" (L1::L') F2 H7 : fresh_name "C" (L1::L') F3 ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< search. Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L1 Body) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< case IsS. Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< Is': assert is_list is_string (X::L'). Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body Is' : is_list is_string (X::L') ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< apply fresh_name_exists to _ Is' with Base = "L". Subgoal 2: Variables: L L' Body SaveL X L1 F Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body Is' : is_list is_string (X::L') H4 : fresh_name "L" (X::L') F ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_is. Proof completed.
< Prove_Constraint exactEval:host:proj_param_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_param_is. Proof completed.
< Prove_Constraint exactEval:host:proj_program_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_program_is. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_unique. Variables: T2 T3 PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) PrB : |{typ}- listTy T3 ~~> T2 IsT : is_typ (listTy T3) ============================ recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = T2
< case PrB. Variables: T3 PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) IsT : is_typ (listTy T3) ============================ recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys)))
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_is. Variables: T1 Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))) IsT : is_typ (listTy T1) ============================ is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
< case IsT. Variables: T1 Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))) H1 : is_typ T1 ============================ is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
< search 11. Proof completed.
< Add_Proj_Rel exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Proof completed.
< Prove_Ext_Ind exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 1.21: Variables: Typ IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (nil Typ) @ R1 : is_typ Typ ============================ <is_expr {P}> (nil Typ)
< search 10. Subgoal 1.22: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (cons Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (cons Expr1 Expr)
< apply IH to R1. Subgoal 1.22: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (cons Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (cons Expr1 Expr)
< apply IH to R2. Subgoal 1.22: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (cons Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (cons Expr1 Expr)
< search 20. Subgoal 1.23: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (head Expr) @ R1 : is_expr Expr * ============================ <is_expr {P}> (head Expr)
< apply IH to R1. Subgoal 1.23: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (head Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (head Expr)
< search 10. Subgoal 1.24: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (tail Expr) @ R1 : is_expr Expr * ============================ <is_expr {P}> (tail Expr)
< apply IH to R1. Subgoal 1.24: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (tail Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (tail Expr)
< search 10. Subgoal 1.25: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (null Expr) @ R1 : is_expr Expr * ============================ <is_expr {P}> (null Expr)
< apply IH to R1. Subgoal 1.25: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (null Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (null Expr)
< search 10. Subgoal 1.26: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (index Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_expr {P}> (index Expr1 Expr)
< apply IH to R1. Subgoal 1.26: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (index Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (index Expr1 Expr)
< apply IH to R2. Subgoal 1.26: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (index Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_expr {P}> (index Expr1 Expr)
< apply fresh_name_exists to _ _ with Base = "I" Names = []. Subgoal 1.26: Variables: Expr Expr1 F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (index Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr H3 : fresh_name "I" [] F ============================ <is_expr {P}> (index Expr1 Expr)
< apply fresh_name_exists to _ _ with Base = "L" Names = []. Subgoal 1.26: Variables: Expr Expr1 F F1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (index Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr H3 : fresh_name "I" [] F H4 : fresh_name "L" [] F1 ============================ <is_expr {P}> (index Expr1 Expr)
< search 20. Subgoal 1.27: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (exactEval:list:length Expr) @ R1 : is_expr Expr * ============================ <is_expr {P}> (exactEval:list:length Expr)
< apply IH to R1. Subgoal 1.27: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (exactEval:list:length Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (exactEval:list:length Expr)
< apply fresh_name_exists to _ _ with Base = "L" Names = []. Subgoal 1.27: Variables: Expr F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (exactEval:list:length Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr H2 : fresh_name "L" [] F ============================ <is_expr {P}> (exactEval:list:length Expr)
< apply fresh_name_exists to _ _ with Base = "Len" Names = []. Subgoal 1.27: Variables: Expr F F1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (exactEval:list:length Expr) @ R1 : is_expr Expr * H1 : <is_expr {P}> Expr H2 : fresh_name "L" [] F H3 : fresh_name "Len" [] F1 ============================ <is_expr {P}> (exactEval:list:length Expr)
< search 20. Subgoal 4.10: Variables: Expr Expr1 S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply IH to R2. Subgoal 4.10: Variables: Expr Expr1 S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply IH to R3. Subgoal 4.10: Variables: Expr Expr1 S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrI: apply fresh_name_exists to _ _ with Base = "I" Names = [S1]. Subgoal 4.10: Variables: Expr Expr1 S1 F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrH: apply fresh_name_exists to _ _ with Base = "Hold" Names = [S1]. Subgoal 4.10.1: Variables: Expr Expr1 S1 F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F ============================ is_string "Hold"
< search 7. Subgoal 4.10: Variables: Expr Expr1 S1 F F1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F FrH : fresh_name "Hold" [S1] F1 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrE: apply fresh_name_exists to _ _ with Base = "E" Names = [S1]. Subgoal 4.10: Variables: Expr Expr1 S1 F F1 F2 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrC: apply fresh_name_exists to _ _ with Base = "C" Names = [S1]. Subgoal 4.10: Variables: Expr Expr1 S1 F F1 F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply fresh_name_is to _ FrI. Subgoal 4.10: Variables: Expr Expr1 S1 F F1 F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] F FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string F ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< rename F to SaveI. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI F1 F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply fresh_name_is to _ FrH. Subgoal 4.10.2: Variables: Expr Expr1 S1 SaveI F1 F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI ============================ is_string "Hold"
< search 7. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI F1 F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] F1 FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI H4 : is_string F1 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< rename F1 to Hold. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI Hold F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI H4 : is_string Hold ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply fresh_name_is to _ FrE. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI Hold F2 F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] F2 FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI H4 : is_string Hold H5 : is_string F2 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< rename F2 to SaveE. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI Hold SaveE F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< apply fresh_name_is to _ FrC. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI Hold SaveE F3 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] F3 H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string F3 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< rename F3 to Copy. Subgoal 4.10: Variables: Expr Expr1 S1 SaveI Hold SaveE Copy IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 Expr1 Expr) @ R1 : is_string S1 R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< rename Expr1 to I. Subgoal 4.10: Variables: Expr I S1 SaveI Hold SaveE Copy IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I Expr) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr Expr * H1 : <is_expr {P}> I H2 : <is_expr {P}> Expr FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy ============================ <is_stmt {P}> (listUpdate S1 I Expr)
< rename Expr to E. Subgoal 4.10: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy ============================ <is_stmt {P}> (listUpdate S1 I E)
< assert [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (exactEval:list:nil intTy)) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))). Subgoal 4.10: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ <is_stmt {P}> (listUpdate S1 I E)
< unfold . Subgoal 4.10: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ exists A1 X_T, (is_string S1 /\ (<is_expr {P}> I /\ <is_expr {P}> E)) /\ (A1 |{stmt}- listUpdate S1 I E ~~> X_T /\ <is_stmt {P}> X_T)
< exists [], scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (exactEval:list:nil intTy)) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))). Subgoal 4.10: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ (is_string S1 /\ (<is_expr {P}> I /\ <is_expr {P}> E)) /\ ([] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) /\ <is_stmt {P}> (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))))
< split. Subgoal 4.10.3: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ is_string S1
< search. Subgoal 4.10.4: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ <is_expr {P}> I
< search. Subgoal 4.10.5: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ <is_expr {P}> E
< search. Subgoal 4.10.6: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
< search. Subgoal 4.10.7: Variables: E I S1 SaveI Hold SaveE Copy IH : forall E1, is_expr E1 * -> <is_expr {P}> E1 IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listUpdate S1 I E) @ R1 : is_string S1 R2 : is_expr I * R3 : is_expr E * H1 : <is_expr {P}> I H2 : <is_expr {P}> E FrI : fresh_name "I" [S1] SaveI FrH : fresh_name "Hold" [S1] Hold FrE : fresh_name "E" [S1] SaveE FrC : fresh_name "C" [S1] Copy H3 : is_string SaveI H4 : is_string Hold H5 : is_string SaveE H6 : is_string Copy H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) ============================ <is_stmt {P}> (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
< search 30. Subgoal 4.11: Variables: Stmt Expr S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listForeach S1 Expr Stmt) @ R1 : is_string S1 R2 : is_expr Expr * R3 : is_stmt Stmt * ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< apply IH to R2. Subgoal 4.11: Variables: Stmt Expr S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listForeach S1 Expr Stmt) @ R1 : is_string S1 R2 : is_expr Expr * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< apply IH3 to R3. Subgoal 4.11: Variables: Stmt Expr S1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listForeach S1 Expr Stmt) @ R1 : is_string S1 R2 : is_expr Expr * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< Fr: apply fresh_name_exists to _ _ with Base = "L" Names = [S1]. Subgoal 4.11: Variables: Stmt Expr S1 F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listForeach S1 Expr Stmt) @ R1 : is_string S1 R2 : is_expr Expr * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt Fr : fresh_name "L" [S1] F ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< apply fresh_name_is to _ Fr. Subgoal 4.11: Variables: Stmt Expr S1 F IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (listForeach S1 Expr Stmt) @ R1 : is_string S1 R2 : is_expr Expr * R3 : is_stmt Stmt * H1 : <is_expr {P}> Expr H2 : <is_stmt {P}> Stmt Fr : fresh_name "L" [S1] F H3 : is_string F ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< search 20. Proof completed.
< Prove exactEval:host:is_args_nilArgs_or_consArgs. Proof completed.
< Prove exactEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs. Proof completed.
< Prove exactEval:host:vars_unique. Subgoal 1.21: Variables: V2 Ty IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (nil Ty) VarsA : vars (nil Ty) [] @ VarsB : vars (nil Ty) V2 ============================ [] = V2
< case VarsB. Subgoal 1.21: Variables: Ty IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (nil Ty) VarsA : vars (nil Ty) [] @ ============================ [] = []
< search. Subgoal 1.22: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (cons E1 E2) VarsA : vars (cons E1 E2) V1 @ VarsB : vars (cons E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.22: Variables: V1 V2 V3 V4 E2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (cons E1 E2) V1 @ VarsB : vars (cons E1 E2) V2 VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.22: Variables: V1 V2 V3 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (cons E1 E2) V1 @ VarsA1 : vars E1 V3 * VarsA2 : vars E2 V4 * VarsA3 : V3 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB : vars E1 V5 VarsB1 : vars E2 V6 VarsB2 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.22: Variables: V1 V2 V4 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (cons E1 E2) V1 @ VarsA1 : vars E1 V5 * VarsA2 : vars E2 V4 * VarsA3 : V5 ++ V4 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB : vars E1 V5 VarsB1 : vars E2 V6 VarsB2 : V5 ++ V6 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB1. Subgoal 1.22: Variables: V1 V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (cons E1 E2) V1 @ VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V1 H1 : is_expr E1 H2 : is_expr E2 VarsB : vars E1 V5 VarsB1 : vars E2 V6 VarsB2 : V5 ++ V6 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB2. Subgoal 1.22: Variables: V2 E2 E1 V5 V6 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (cons E1 E2) V2 @ VarsA1 : vars E1 V5 * VarsA2 : vars E2 V6 * VarsA3 : V5 ++ V6 = V2 H1 : is_expr E1 H2 : is_expr E2 VarsB : vars E1 V5 VarsB1 : vars E2 V6 VarsB2 : V5 ++ V6 = V2 ============================ V2 = V2
< search. Subgoal 1.23: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (head E1) VarsA : vars (head E1) V1 @ VarsB : vars (head E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.23: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (head E1) V1 @ VarsB : vars (head E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.23: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (head E1) V1 @ VarsA1 : vars E1 V1 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.23: Variables: V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (head E1) V2 @ VarsA1 : vars E1 V2 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.24: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (tail E1) VarsA : vars (tail E1) V1 @ VarsB : vars (tail E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.24: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (tail E1) V1 @ VarsB : vars (tail E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.24: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (tail E1) V1 @ VarsA1 : vars E1 V1 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.24: Variables: V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (tail E1) V2 @ VarsA1 : vars E1 V2 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.25: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (null E1) VarsA : vars (null E1) V1 @ VarsB : vars (null E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.25: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (null E1) V1 @ VarsB : vars (null E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.25: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (null E1) V1 @ VarsA1 : vars E1 V1 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.25: Variables: V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (null E1) V2 @ VarsA1 : vars E1 V2 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.26: Variables: V1 V2 VL VI I L IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (index L I) VarsA : vars (index L I) V1 @ VarsB : vars (index L I) V2 VarsA1 : vars L VL * VarsA2 : vars I VI * VarsA3 : VL ++ VI = V1 ============================ V1 = V2
< case IsE. Subgoal 1.26: Variables: V1 V2 VL VI I L IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (index L I) V1 @ VarsB : vars (index L I) V2 VarsA1 : vars L VL * VarsA2 : vars I VI * VarsA3 : VL ++ VI = V1 H1 : is_expr L H2 : is_expr I ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.26: Variables: V1 V2 VL VI I L VL1 VI1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (index L I) V1 @ VarsA1 : vars L VL * VarsA2 : vars I VI * VarsA3 : VL ++ VI = V1 H1 : is_expr L H2 : is_expr I VarsB : vars L VL1 VarsB1 : vars I VI1 VarsB2 : VL1 ++ VI1 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.26: Variables: V1 V2 VI I L VL1 VI1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (index L I) V1 @ VarsA1 : vars L VL1 * VarsA2 : vars I VI * VarsA3 : VL1 ++ VI = V1 H1 : is_expr L H2 : is_expr I VarsB : vars L VL1 VarsB1 : vars I VI1 VarsB2 : VL1 ++ VI1 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB1. Subgoal 1.26: Variables: V1 V2 I L VL1 VI1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (index L I) V1 @ VarsA1 : vars L VL1 * VarsA2 : vars I VI1 * VarsA3 : VL1 ++ VI1 = V1 H1 : is_expr L H2 : is_expr I VarsB : vars L VL1 VarsB1 : vars I VI1 VarsB2 : VL1 ++ VI1 = V2 ============================ V1 = V2
< apply append_unique to VarsA3 VarsB2. Subgoal 1.26: Variables: V2 I L VL1 VI1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (index L I) V2 @ VarsA1 : vars L VL1 * VarsA2 : vars I VI1 * VarsA3 : VL1 ++ VI1 = V2 H1 : is_expr L H2 : is_expr I VarsB : vars L VL1 VarsB1 : vars I VI1 VarsB2 : VL1 ++ VI1 = V2 ============================ V2 = V2
< search. Subgoal 1.27: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (exactEval:list:length E1) VarsA : vars (exactEval:list:length E1) V1 @ VarsB : vars (exactEval:list:length E1) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.27: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (exactEval:list:length E1) V1 @ VarsB : vars (exactEval:list:length E1) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.27: Variables: V1 V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (exactEval:list:length E1) V1 @ VarsA1 : vars E1 V1 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.27: Variables: V2 E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (exactEval:list:length E1) V2 @ VarsA1 : vars E1 V2 * H1 : is_expr E1 VarsB : vars E1 V2 ============================ V2 = V2
< search. Proof completed.
< Prove exactEval:host:vars_is. Subgoal 1.21: Variables: Ty IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (nil Ty) V : vars (nil Ty) [] @ ============================ is_list is_string []
< search. Subgoal 1.22: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (cons E1 E2) V : vars (cons E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V ============================ is_list is_string V
< case IsE. Subgoal 1.22: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (cons E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.22: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (cons E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string V2 ============================ is_list is_string V
< apply IH to _ V2. Subgoal 1.22: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (cons E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string V2 H4 : is_list is_string V3 ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.22: Variables: V V2 V3 E2 E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (cons E1 E2) V @ V1 : vars E1 V2 * V2 : vars E2 V3 * V3 : V2 ++ V3 = V H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string V2 H4 : is_list is_string V3 H5 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.23: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (head E1) V : vars (head E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.23: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (head E1) V @ V1 : vars E1 V * H1 : is_expr E1 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.23: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (head E1) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.24: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (tail E1) V : vars (tail E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.24: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (tail E1) V @ V1 : vars E1 V * H1 : is_expr E1 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.24: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (tail E1) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.25: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (null E1) V : vars (null E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.25: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (null E1) V @ V1 : vars E1 V * H1 : is_expr E1 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.25: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (null E1) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.26: Variables: V VL VI I L IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (index L I) V : vars (index L I) V @ V1 : vars L VL * V2 : vars I VI * V3 : VL ++ VI = V ============================ is_list is_string V
< case IsE. Subgoal 1.26: Variables: V VL VI I L IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (index L I) V @ V1 : vars L VL * V2 : vars I VI * V3 : VL ++ VI = V H1 : is_expr L H2 : is_expr I ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.26: Variables: V VL VI I L IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (index L I) V @ V1 : vars L VL * V2 : vars I VI * V3 : VL ++ VI = V H1 : is_expr L H2 : is_expr I H3 : is_list is_string VL ============================ is_list is_string V
< apply IH to _ V2. Subgoal 1.26: Variables: V VL VI I L IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (index L I) V @ V1 : vars L VL * V2 : vars I VI * V3 : VL ++ VI = V H1 : is_expr L H2 : is_expr I H3 : is_list is_string VL H4 : is_list is_string VI ============================ is_list is_string V
< apply append_list_string_is to _ _ V3. Subgoal 1.26: Variables: V VL VI I L IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (index L I) V @ V1 : vars L VL * V2 : vars I VI * V3 : VL ++ VI = V H1 : is_expr L H2 : is_expr I H3 : is_list is_string VL H4 : is_list is_string VI H5 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.27: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (exactEval:list:length E1) V : vars (exactEval:list:length E1) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.27: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (exactEval:list:length E1) V @ V1 : vars E1 V * H1 : is_expr E1 ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.27: Variables: V E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (exactEval:list:length E1) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_list is_string V ============================ is_list is_string V
< search. Proof completed.
< Prove exactEval:host:vars_exist, exactEval:host:varsArgs_exist, exactEval:host:varsRecFields_exist. Subgoal 1.21: Variables: Typ IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (nil Typ) @ IsE1 : is_typ Typ ============================ exists V, vars (nil Typ) V
< search. Subgoal 1.22: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (cons Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.22: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (cons Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.22: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (cons Expr1 Expr) V
< IsV1: apply vars_is to _ V1. Subgoal 1.22: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V ============================ exists V, vars (cons Expr1 Expr) V
< IsV2: apply vars_is to _ V2. Subgoal 1.22: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V IsV2 : is_list is_string V1 ============================ exists V, vars (cons Expr1 Expr) V
< apply append_list_string_total to IsV1 IsV2. Subgoal 1.22: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (cons Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V IsV2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (cons Expr1 Expr) V
< search. Subgoal 1.23: Variables: Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (head Expr) @ IsE1 : is_expr Expr * ============================ exists V, vars (head Expr) V
< apply IH to IsE1. Subgoal 1.23: Variables: Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (head Expr) @ IsE1 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (head Expr) V
< search. Subgoal 1.24: Variables: Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (tail Expr) @ IsE1 : is_expr Expr * ============================ exists V, vars (tail Expr) V
< apply IH to IsE1. Subgoal 1.24: Variables: Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (tail Expr) @ IsE1 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (tail Expr) V
< search. Subgoal 1.25: Variables: Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (null Expr) @ IsE1 : is_expr Expr * ============================ exists V, vars (null Expr) V
< apply IH to IsE1. Subgoal 1.25: Variables: Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (null Expr) @ IsE1 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (null Expr) V
< search. Subgoal 1.26: Variables: Expr Expr1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists V, vars (index Expr1 Expr) V
< V1: apply IH to IsE1. Subgoal 1.26: Variables: Expr Expr1 V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V ============================ exists V, vars (index Expr1 Expr) V
< V2: apply IH to IsE2. Subgoal 1.26: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 ============================ exists V, vars (index Expr1 Expr) V
< IsV1: apply vars_is to _ V1. Subgoal 1.26: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V ============================ exists V, vars (index Expr1 Expr) V
< IsV2: apply vars_is to _ V2. Subgoal 1.26: Variables: Expr Expr1 V V1 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V IsV2 : is_list is_string V1 ============================ exists V, vars (index Expr1 Expr) V
< apply append_list_string_total to IsV1 IsV2. Subgoal 1.26: Variables: Expr Expr1 V V1 L3 IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (index Expr1 Expr) @ IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * V1 : vars Expr1 V V2 : vars Expr V1 IsV1 : is_list is_string V IsV2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (index Expr1 Expr) V
< search. Subgoal 1.27: Variables: Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (exactEval:list:length Expr) @ IsE1 : is_expr Expr * ============================ exists V, vars (exactEval:list:length Expr) V
< apply IH to IsE1. Subgoal 1.27: Variables: Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (exactEval:list:length Expr) @ IsE1 : is_expr Expr * H1 : vars Expr V ============================ exists V, vars (exactEval:list:length Expr) V
< search. Proof completed.
< Prove exactEval:host:stmtNames_is, exactEval:host:stmtNames_isCtx, exactEval:host:exprNames_is. Subgoal 1.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N ============================ is_list is_string N
< case IsS. Subgoal 1.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list is_string N
< apply IH_E to _ _ SN2. Subgoal 1.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI ============================ is_list is_string N
< apply IH_E to _ _ SN3. Subgoal 1.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI H5 : is_list is_string NE ============================ is_list is_string N
< apply append_list_string_is to _ _ SN4. Subgoal 1.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI H5 : is_list is_string NE H6 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 1.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 ============================ is_list is_string (L::N1)
< case IsS. Subgoal 1.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list is_string (L::N1)
< apply IH_E to _ _ SN2. Subgoal 1.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI ============================ is_list is_string (L::N1)
< apply IH_E to _ _ SN3. Subgoal 1.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI H5 : is_list is_string NE ============================ is_list is_string (L::N1)
< apply append_list_string_is to _ _ SN4. Subgoal 1.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI H5 : is_list is_string NE H6 : is_list is_string N1 ============================ is_list is_string (L::N1)
< search. Subgoal 1.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listForeach I L Body) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N ============================ is_list is_string N
< case IsS. Subgoal 1.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body H4 : is_list is_string NL ============================ is_list is_string N
< apply IH_S to _ _ SN2. Subgoal 1.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body H4 : is_list is_string NL H5 : is_list is_string NB ============================ is_list is_string N
< apply append_list_string_is to _ _ SN3. Subgoal 1.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body H4 : is_list is_string NL H5 : is_list is_string NB H6 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 2.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N ============================ is_list (is_list is_string) Ctx'
< case IsS. Subgoal 2.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list (is_list is_string) Ctx'
< apply IH_E to _ _ SN2. Subgoal 2.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI ============================ is_list (is_list is_string) Ctx'
< apply IH_E to _ _ SN3. Subgoal 2.12: Variables: N Ctx' NI NE E I L IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @ SN1 : mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_string NI H5 : is_list is_string NE ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 ============================ is_list (is_list is_string) Ctx'
< case IsS. Subgoal 2.13: Variables: Ctx' NI NE N1 L E I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @ SN1 : not_mems L Ctx' SN2 : exprNames Ctx' I NI * SN3 : exprNames Ctx' E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 2.14: Variables: N Ctx' NL NB Ctx2 Body L I IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (listForeach I L Body) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @ SN1 : exprNames Ctx' L NL * SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 * SN3 : NL ++ NB = N ============================ is_list (is_list is_string) Ctx'
< search. Subgoal 3.22: Variables: Ctx Ty IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (nil Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) [] @ ============================ is_list is_string []
< search. Subgoal 3.23: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (cons E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.23: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.23: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.23: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.23: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.24: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (head E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.24: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.24: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.25: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (tail E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.25: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.25: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.26: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (null E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.26: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.26: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.27: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (index E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ is_list is_string N
< case IsE. Subgoal 3.27: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.27: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.27: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN3. Subgoal 3.27: Variables: Ctx N N2 N3 E2 E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_string N2 H4 : is_list is_string N3 H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 3.28: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (exactEval:list:length E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.28: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.28: Variables: Ctx N E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_list is_string N ============================ is_list is_string N
< search. Proof completed.
< Prove exactEval:host:stmtNames_unique, exactEval:host:exprNames_unique. Subgoal 1.12: Variables: NA CtxA NB CtxB NI NE E I L IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listUpdate L I E) NA CtxA @ SNB : stmtNames CtxA (listUpdate L I E) NB CtxB SNA1 : mems L CtxA SNA2 : exprNames CtxA I NI * SNA3 : exprNames CtxA E NE * SNA4 : NI ++ NE = NA ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.12: Variables: NA CtxA NB CtxB NI NE E I L IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listUpdate L I E) NA CtxA @ SNB : stmtNames CtxA (listUpdate L I E) NB CtxB SNA1 : mems L CtxA SNA2 : exprNames CtxA I NI * SNA3 : exprNames CtxA E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.12.1: Variables: NA NB CtxB NI NE E I L NI1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @ SNA1 : mems L CtxB SNA2 : exprNames CtxB I NI * SNA3 : exprNames CtxB E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.12.1: Variables: NA NB CtxB NE E I L NI1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @ SNA1 : mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE * SNA4 : NI1 ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA3 SNB2. Subgoal 1.12.1: Variables: NA NB CtxB E I L NI1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @ SNA1 : mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE1 * SNA4 : NI1 ++ NE1 = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA4 SNB3. Subgoal 1.12.1: Variables: NB CtxB E I L NI1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) NB CtxB @ SNA1 : mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE1 * SNA4 : NI1 ++ NE1 = NB H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 1.12.2: Variables: NA CtxB NI NE E I L NI1 NE1 N IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @ SNA1 : mems L CtxB SNA2 : exprNames CtxB I NI * SNA3 : exprNames CtxB E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = N ============================ NA = L::N /\ CtxB = CtxB
< apply not_mems to SNB SNA1. Subgoal 1.13: Variables: CtxA NB CtxB NI NE N L E I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listUpdate L I E) (L::N) CtxA @ SNB : stmtNames CtxA (listUpdate L I E) NB CtxB SNA1 : not_mems L CtxA SNA2 : exprNames CtxA I NI * SNA3 : exprNames CtxA E NE * SNA4 : NI ++ NE = N ============================ L::N = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.13: Variables: CtxA NB CtxB NI NE N L E I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listUpdate L I E) (L::N) CtxA @ SNB : stmtNames CtxA (listUpdate L I E) NB CtxB SNA1 : not_mems L CtxA SNA2 : exprNames CtxA I NI * SNA3 : exprNames CtxA E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ L::N = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.13.1: Variables: NB CtxB NI NE N L E I NI1 NE1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @ SNA1 : not_mems L CtxB SNA2 : exprNames CtxB I NI * SNA3 : exprNames CtxB E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = NB ============================ L::N = NB /\ CtxB = CtxB
< apply not_mems to SNA1 SNB. Subgoal 1.13.2: Variables: CtxB NI NE N L E I NI1 NE1 N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @ SNA1 : not_mems L CtxB SNA2 : exprNames CtxB I NI * SNA3 : exprNames CtxB E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ L::N = L::N1 /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.13.2: Variables: CtxB NE N L E I NI1 NE1 N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @ SNA1 : not_mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE * SNA4 : NI1 ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ L::N = L::N1 /\ CtxB = CtxB
< apply IH_E to _ _ SNA3 SNB2. Subgoal 1.13.2: Variables: CtxB N L E I NI1 NE1 N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @ SNA1 : not_mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE1 * SNA4 : NI1 ++ NE1 = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ L::N = L::N1 /\ CtxB = CtxB
< apply append_unique to SNA4 SNB3. Subgoal 1.13.2: Variables: CtxB L E I NI1 NE1 N1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listUpdate L I E) (L::N1) CtxB @ SNA1 : not_mems L CtxB SNA2 : exprNames CtxB I NI1 * SNA3 : exprNames CtxB E NE1 * SNA4 : NI1 ++ NE1 = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L CtxB SNB1 : exprNames CtxB I NI1 SNB2 : exprNames CtxB E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ L::N1 = L::N1 /\ CtxB = CtxB
< search. Subgoal 1.14: Variables: NA CtxA NB CtxB NL NB1 Ctx2 Body L I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (listForeach I L Body) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listForeach I L Body) NA CtxA @ SNB : stmtNames CtxA (listForeach I L Body) NB CtxB SNA1 : exprNames CtxA L NL * SNA2 : stmtNames ([I]::CtxA) Body NB1 Ctx2 * SNA3 : NL ++ NB1 = NA ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.14: Variables: NA CtxA NB CtxB NL NB1 Ctx2 Body L I IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (listForeach I L Body) NA CtxA @ SNB : stmtNames CtxA (listForeach I L Body) NB CtxB SNA1 : exprNames CtxA L NL * SNA2 : stmtNames ([I]::CtxA) Body NB1 Ctx2 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.14: Variables: NA NB CtxB NL NB1 Ctx2 Body L I NL1 NB2 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @ SNA1 : exprNames CtxB L NL * SNA2 : stmtNames ([I]::CtxB) Body NB1 Ctx2 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames CtxB L NL1 SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1 SNB2 : NL1 ++ NB2 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.14: Variables: NA NB CtxB NB1 Ctx2 Body L I NL1 NB2 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @ SNA1 : exprNames CtxB L NL1 * SNA2 : stmtNames ([I]::CtxB) Body NB1 Ctx2 * SNA3 : NL1 ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames CtxB L NL1 SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1 SNB2 : NL1 ++ NB2 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_S to _ _ SNA2 SNB1. Subgoal 1.14: Variables: NA NB CtxB Body L I NL1 NB2 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @ SNA1 : exprNames CtxB L NL1 * SNA2 : stmtNames ([I]::CtxB) Body NB2 Ctx1 * SNA3 : NL1 ++ NB2 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames CtxB L NL1 SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1 SNB2 : NL1 ++ NB2 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA3 SNB2. Subgoal 1.14: Variables: NB CtxB Body L I NL1 NB2 Ctx1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (listForeach I L Body) NB CtxB @ SNA1 : exprNames CtxB L NL1 * SNA2 : stmtNames ([I]::CtxB) Body NB2 Ctx1 * SNA3 : NL1 ++ NB2 = NB H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames CtxB L NL1 SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1 SNB2 : NL1 ++ NB2 = NB ============================ NB = NB /\ CtxB = CtxB
< search. Subgoal 2.22: Variables: Ctx NB Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (nil Ty) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (nil Ty) [] @ ENB : exprNames Ctx (nil Ty) NB ============================ [] = NB
< case ENB. Subgoal 2.22: Variables: Ctx Ty IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (nil Ty) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (nil Ty) [] @ ============================ [] = []
< search. Subgoal 2.23: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (cons E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NA @ ENB : exprNames Ctx (cons E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.23: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NA @ ENB : exprNames Ctx (cons E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.23: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.23: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.23: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.23: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (cons E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.24: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (head E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (head E1) NA @ ENB : exprNames Ctx (head E1) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.24: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (head E1) NA @ ENB : exprNames Ctx (head E1) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.24: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (head E1) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.24: Variables: Ctx NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (head E1) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 2.25: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (tail E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (tail E1) NA @ ENB : exprNames Ctx (tail E1) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.25: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (tail E1) NA @ ENB : exprNames Ctx (tail E1) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.25: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (tail E1) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.25: Variables: Ctx NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (tail E1) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 2.26: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (null E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (null E1) NA @ ENB : exprNames Ctx (null E1) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.26: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (null E1) NA @ ENB : exprNames Ctx (null E1) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.26: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (null E1) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.26: Variables: Ctx NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (null E1) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Subgoal 2.27: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (index E1 E2) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NA @ ENB : exprNames Ctx (index E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA ============================ NA = NB
< case IsE. Subgoal 2.27: Variables: Ctx NA NB N1 N2 E2 E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NA @ ENB : exprNames Ctx (index E1 E2) NB ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ NA = NB
< ENB: case ENB. Subgoal 2.27: Variables: Ctx NA NB N1 N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NA @ ENA1 : exprNames Ctx E1 N1 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.27: Variables: Ctx NA NB N2 E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N2 * ENA3 : N3 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.27: Variables: Ctx NA NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NA @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NA = NB
< apply append_unique to ENA3 ENB2. Subgoal 2.27: Variables: Ctx NB E2 E1 N3 N4 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (index E1 E2) NB @ ENA1 : exprNames Ctx E1 N3 * ENA2 : exprNames Ctx E2 N4 * ENA3 : N3 ++ N4 = NB H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames Ctx E1 N3 ENB1 : exprNames Ctx E2 N4 ENB2 : N3 ++ N4 = NB ============================ NB = NB
< search. Subgoal 2.28: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (exactEval:list:length E1) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (exactEval:list:length E1) NA @ ENB : exprNames Ctx (exactEval:list:length E1) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.28: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (exactEval:list:length E1) NA @ ENB : exprNames Ctx (exactEval:list:length E1) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ============================ NA = NB
< ENB: case ENB. Subgoal 2.28: Variables: Ctx NA NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (exactEval:list:length E1) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.28: Variables: Ctx NB E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (exactEval:list:length E1) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Proof completed.
< Prove exactEval:host:stmtNames_keep_older. Subgoal 12: Variables: Scope Ctx N NI NE E I L IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 13: Variables: Scope Ctx NI NE N1 L E I IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Subgoal 14: Variables: Scope Ctx N NL NB Ctx2 Body L I IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (listForeach I L Body) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Proof completed.
< Prove exactEval:host:stmtNames_exists, exactEval:host:exprNames_exists, exactEval:host:argsNames_exists, exactEval:host:recFieldNames_exists. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< EN1: apply IH_E to IsS2 IsCtx. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< EN2: apply IH_E to IsS3 IsCtx. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< Is1: apply exprNames_is to _ _ EN1. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< Is2: apply exprNames_is to _ _ EN2. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< apply append_list_string_total to Is1 Is2. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< Or: apply mems_or_not_mems to IsCtx IsS1. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 S1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 Or : mems S1 (Scope::Ctx) \/ not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< M: case Or. Subgoal 1.10.1: Variables: Scope Ctx Expr Expr1 S1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 M : mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< search. Subgoal 1.10.2: Variables: Scope Ctx Expr Expr1 S1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listUpdate S1 Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr1 * IsS3 : is_expr Expr * EN1 : exprNames (Scope::Ctx) Expr1 N EN2 : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 M : not_mems S1 (Scope::Ctx) ============================ exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
< search. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< EN: apply IH_E to IsS2 IsCtx. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * EN : exprNames (Scope::Ctx) Expr N ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< SN: apply IH_S to IsS3 _ with Ctx = Scope::Ctx Scope = [S1]. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * EN : exprNames (Scope::Ctx) Expr N SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx' ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< Is1: apply exprNames_is to _ _ EN. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * EN : exprNames (Scope::Ctx) Expr N SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx' Is1 : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< Is2: apply stmtNames_is to _ _ SN. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 N N1 Ctx' IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * EN : exprNames (Scope::Ctx) Expr N SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx' Is1 : is_list is_string N Is2 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< apply append_list_string_total to Is1 Is2. Subgoal 1.11: Variables: Scope Ctx Stmt Expr S1 N N1 Ctx' L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (listForeach S1 Expr Stmt) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_string S1 IsS2 : is_expr Expr * IsS3 : is_stmt Stmt * EN : exprNames (Scope::Ctx) Expr N SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx' Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
< search. Subgoal 2.21: Variables: Ctx Typ IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (nil Typ) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_typ Typ ============================ exists N, exprNames Ctx (nil Typ) N
< search. Subgoal 2.22: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< EN1: apply IH_E to IsE1 IsCtx. Subgoal 2.22: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< EN2: apply IH_E to IsE2 IsCtx. Subgoal 2.22: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< Is1: apply exprNames_is to _ _ EN1. Subgoal 2.22: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< Is2: apply exprNames_is to _ _ EN2. Subgoal 2.22: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< apply append_list_string_total to Is1 Is2. Subgoal 2.22: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (cons Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (cons Expr1 Expr) N
< search. Subgoal 2.23: Variables: Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (head Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * ============================ exists N, exprNames Ctx (head Expr) N
< apply IH_E to IsE1 IsCtx. Subgoal 2.23: Variables: Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (head Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (head Expr) N
< search. Subgoal 2.24: Variables: Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (tail Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * ============================ exists N, exprNames Ctx (tail Expr) N
< apply IH_E to IsE1 IsCtx. Subgoal 2.24: Variables: Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (tail Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (tail Expr) N
< search. Subgoal 2.25: Variables: Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (null Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * ============================ exists N, exprNames Ctx (null Expr) N
< apply IH_E to IsE1 IsCtx. Subgoal 2.25: Variables: Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (null Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (null Expr) N
< search. Subgoal 2.26: Variables: Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< EN1: apply IH_E to IsE1 IsCtx. Subgoal 2.26: Variables: Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< EN2: apply IH_E to IsE2 IsCtx. Subgoal 2.26: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< Is1: apply exprNames_is to _ _ EN1. Subgoal 2.26: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< Is2: apply exprNames_is to _ _ EN2. Subgoal 2.26: Variables: Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< apply append_list_string_total to Is1 Is2. Subgoal 2.26: Variables: Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (index Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr1 * IsE2 : is_expr Expr * EN1 : exprNames Ctx Expr1 N EN2 : exprNames Ctx Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N, exprNames Ctx (index Expr1 Expr) N
< search. Subgoal 2.27: Variables: Ctx Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (exactEval:list:length Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * ============================ exists N, exprNames Ctx (exactEval:list:length Expr) N
< apply IH_E to IsE1 IsCtx. Subgoal 2.27: Variables: Ctx Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (exactEval:list:length Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (exactEval:list:length Expr) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_not_in_ctx, exactEval:host:exprNames_not_in_ctx. Subgoal 1.12: Variables: Scope Ctx N X NI NE E I L IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N ============================ false
< case IsS. Subgoal 1.12: Variables: Scope Ctx N X NI NE E I L IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ false
< Or: apply mem_append to MemN SN4. Subgoal 1.12: Variables: Scope Ctx N X NI NE E I L IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E Or : mem X NI \/ mem X NE ============================ false
< M: case Or. Subgoal 1.12.1: Variables: Scope Ctx N X NI NE E I L IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E M : mem X NI ============================ false
< apply IH_E to _ _ SN2 M MemsCtx. Subgoal 1.12.2: Variables: Scope Ctx N X NI NE E I L IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E M : mem X NE ============================ false
< apply IH_E to _ _ SN3 M MemsCtx. Subgoal 1.13: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (listUpdate L I E) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemN : mem X (L::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 ============================ false
< case IsS. Subgoal 1.13: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemN : mem X (L::N1) MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ false
< MN: case MemN. Subgoal 1.13.1: Variables: Scope Ctx NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemsCtx : mems L (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ false
< apply not_mems to SN1 MemsCtx. Subgoal 1.13.2: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E MN : mem X N1 ============================ false
< Or: apply mem_append to MN SN4. Subgoal 1.13.2: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E MN : mem X N1 Or : mem X NI \/ mem X NE ============================ false
< M: case Or. Subgoal 1.13.2.1: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E MN : mem X N1 M : mem X NI ============================ false
< apply IH_E to _ _ SN2 M MemsCtx. Subgoal 1.13.2.2: Variables: Scope Ctx X NI NE N1 L E I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @ MemsCtx : mems X (Scope::Ctx) SN1 : not_mems L (Scope::Ctx) SN2 : exprNames (Scope::Ctx) I NI * SN3 : exprNames (Scope::Ctx) E NE * SN4 : NI ++ NE = N1 H1 : is_string L H2 : is_expr I H3 : is_expr E MN : mem X N1 M : mem X NE ============================ false
< apply IH_E to _ _ SN3 M MemsCtx. Subgoal 1.14: Variables: Scope Ctx N X NL NB Ctx2 Body L I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (listForeach I L Body) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N ============================ false
< case IsS. Subgoal 1.14: Variables: Scope Ctx N X NL NB Ctx2 Body L I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body ============================ false
< Or: apply mem_append to MemN SN3. Subgoal 1.14: Variables: Scope Ctx N X NL NB Ctx2 Body L I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body Or : mem X NL \/ mem X NB ============================ false
< M: case Or. Subgoal 1.14.1: Variables: Scope Ctx N X NL NB Ctx2 Body L I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body M : mem X NL ============================ false
< apply IH_E to _ _ SN1 M MemsCtx. Subgoal 1.14.2: Variables: Scope Ctx N X NL NB Ctx2 Body L I IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) L NL * SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 * SN3 : NL ++ NB = N H1 : is_string I H2 : is_expr L H3 : is_stmt Body M : mem X NB ============================ false
< apply IH_S to _ _ SN2 M _. Subgoal 2.22: Variables: Ctx X Ty IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (nil Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) [] @ MemN : mem X [] MemsCtx : mems X Ctx ============================ false
< case MemN. Subgoal 2.23: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (cons E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.23: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.23: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.23.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.23.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.24: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (head E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.24: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 2.25: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (tail E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.25: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 2.26: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (null E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.26: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Subgoal 2.27: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (index E1 E2) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N ============================ false
< case IsE. Subgoal 2.27: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ false
< Or: apply mem_append to MemN EN3. Subgoal 2.27: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 Or : mem X N2 \/ mem X N3 ============================ false
< M: case Or. Subgoal 2.27.1: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N2 ============================ false
< apply IH_E to _ _ EN1 M MemsCtx. Subgoal 2.27.2: Variables: Ctx N X N2 N3 E2 E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index E1 E2) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N2 * EN2 : exprNames Ctx E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 M : mem X N3 ============================ false
< apply IH_E to _ _ EN2 M MemsCtx. Subgoal 2.28: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (exactEval:list:length E1) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.28: Variables: Ctx N X E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Proof completed.
< Prove exactEval:host:stmtNames_relatedCtxs, exactEval:host:stmtNames_relatedCtxs_ctx_fwd, exactEval:host:stmtNames_relatedCtxs_ctx_back, exactEval:host:exprNames_relatedCtxs. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< Is': case IsS. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< EN1: apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< EN2: apply IH_E to _ _ _ RelAB RelBA SN3. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< Is1: apply exprNames_is to _ _ EN1. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< Is2: apply exprNames_is to _ _ EN2. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< Or: apply mems_or_not_mems to IsCtxB Is'. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE Or : mems L (ScopeB::CtxB) \/ not_mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< M: case Or. Subgoal 1.12.1: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< search. Subgoal 1.12.2: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : not_mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< MB: apply RelAB to SN1. Subgoal 1.12.2: Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @ SN1 : mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : not_mems L (ScopeB::CtxB) MB : mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
< apply not_mems to M MB. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< Is': case IsS. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< EN1: apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< EN2: apply IH_E to _ _ _ RelAB RelBA SN3. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< Is1: apply exprNames_is to _ _ EN1. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< Is2: apply exprNames_is to _ _ EN2. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< Or: apply mems_or_not_mems to IsCtxB Is'. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE Or : mems L (ScopeB::CtxB) \/ not_mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< M: case Or. Subgoal 1.13.1: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< MA: apply RelBA to M. Subgoal 1.13.1: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : mems L (ScopeB::CtxB) MA : mems L (ScopeA::CtxA) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< apply not_mems to SN1 MA. Subgoal 1.13.2: Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @ SN1 : not_mems L (ScopeA::CtxA) SN2 : exprNames (ScopeA::CtxA) I NI * SN3 : exprNames (ScopeA::CtxA) E NE * SN4 : NI ++ NE = N1 Is' : is_string L Is'1 : is_expr I Is'2 : is_expr E EN1 : exprNames (ScopeB::CtxB) I NI EN2 : exprNames (ScopeB::CtxB) E NE Is1 : is_list is_string NI Is2 : is_list is_string NE M : not_mems L (ScopeB::CtxB) ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
< search. Subgoal 1.14: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
< Is': case IsS. Subgoal 1.14: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
< EN: apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.14: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
< SN: apply IH_S to _ _ _ _ _ SN2 with ScopeB = [I] CtxB = ScopeB::CtxB. Subgoal 1.14.1: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL ============================ forall X, mems X ([I]::(ScopeB::CtxB)) -> mems X ([I]::(ScopeA::CtxA))
< intros M. Subgoal 1.14.1: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X ([I]::(ScopeB::CtxB)) ============================ mems X ([I]::(ScopeA::CtxA))
< M: case M. Subgoal 1.14.1.1: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mem X [I] ============================ mems X ([I]::(ScopeA::CtxA))
< search. Subgoal 1.14.1.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X (ScopeB::CtxB) ============================ mems X ([I]::(ScopeA::CtxA))
< apply RelBA to M. Subgoal 1.14.1.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X (ScopeB::CtxB) H1 : mems X (ScopeA::CtxA) ============================ mems X ([I]::(ScopeA::CtxA))
< search. Subgoal 1.14.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL ============================ forall X, mems X ([I]::(ScopeA::CtxA)) -> mems X ([I]::(ScopeB::CtxB))
< intros M. Subgoal 1.14.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X ([I]::(ScopeA::CtxA)) ============================ mems X ([I]::(ScopeB::CtxB))
< M: case M. Subgoal 1.14.2.1: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mem X [I] ============================ mems X ([I]::(ScopeB::CtxB))
< search. Subgoal 1.14.2.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X (ScopeA::CtxA) ============================ mems X ([I]::(ScopeB::CtxB))
< apply RelAB to M. Subgoal 1.14.2.2: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL M : mems X (ScopeA::CtxA) H1 : mems X (ScopeB::CtxB) ============================ mems X ([I]::(ScopeB::CtxB))
< search. Subgoal 1.14: Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I CtxB' IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) L NL * SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 * SN3 : NL ++ NB = N Is' : is_string I Is'1 : is_expr L Is'2 : is_stmt Body EN : exprNames (ScopeB::CtxB) L NL SN4 : stmtNames ([I]::(ScopeB::CtxB)) Body NB CtxB' ============================ exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
< search. Subgoal 2.12: Variables: NA CtxA' CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ SNB : stmtNames CtxB (listUpdate L I E) NB CtxB' Mems : mems X CtxA' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.12.1: Variables: NA CtxA' NB CtxB' X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA SNB : mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X CtxB'
< backchain RelAB. Subgoal 2.12.2: Variables: NA CtxA' CtxB' X NI NE E I L NI1 NE1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ Mems : mems X CtxA' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA SNB : not_mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = N ============================ mems X CtxB'
< backchain RelAB. Subgoal 2.13: Variables: CtxA' CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ SNB : stmtNames CtxB (listUpdate L I E) NB CtxB' Mems : mems X CtxA' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.13.1: Variables: CtxA' NB CtxB' X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N SNB : mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X CtxB'
< backchain RelAB. Subgoal 2.13.2: Variables: CtxA' CtxB' X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ Mems : mems X CtxA' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N SNB : not_mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ mems X CtxB'
< backchain RelAB. Subgoal 2.14: Variables: NA CtxA' CtxB NB CtxB' X NL NB1 Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @ SNB : stmtNames CtxB (listForeach I L Body) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' L NL * SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.14: Variables: NA CtxA' NB CtxB' X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' L NL * SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA SNB : exprNames CtxB' L NL1 SNB1 : stmtNames ([I]::CtxB') Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB ============================ mems X CtxB'
< backchain RelAB. Subgoal 3.12: Variables: NA CtxA' CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ SNB : stmtNames CtxB (listUpdate L I E) NB CtxB' Mems : mems X CtxB' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.12.1: Variables: NA CtxA' NB CtxB' X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA SNB : mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X CtxA'
< backchain RelBA. Subgoal 3.12.2: Variables: NA CtxA' CtxB' X NI NE E I L NI1 NE1 N IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @ Mems : mems X CtxB' SNA1 : mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = NA SNB : not_mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = N ============================ mems X CtxA'
< backchain RelBA. Subgoal 3.13: Variables: CtxA' CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ SNB : stmtNames CtxB (listUpdate L I E) NB CtxB' Mems : mems X CtxB' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.13.1: Variables: CtxA' NB CtxB' X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N SNB : mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X CtxA'
< backchain RelBA. Subgoal 3.13.2: Variables: CtxA' CtxB' X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @ Mems : mems X CtxB' SNA1 : not_mems L CtxA' SNA2 : exprNames CtxA' I NI * SNA3 : exprNames CtxA' E NE * SNA4 : NI ++ NE = N SNB : not_mems L CtxB' SNB1 : exprNames CtxB' I NI1 SNB2 : exprNames CtxB' E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ mems X CtxA'
< backchain RelBA. Subgoal 3.14: Variables: NA CtxA' CtxB NB CtxB' X NL NB1 Ctx1 Body L I IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @ SNB : stmtNames CtxB (listForeach I L Body) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames CtxA' L NL * SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.14: Variables: NA CtxA' NB CtxB' X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' L NL * SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA SNB : exprNames CtxB' L NL1 SNB1 : stmtNames ([I]::CtxB') Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB ============================ mems X CtxA'
< backchain RelBA. Subgoal 4.22: Variables: CtxA CtxB Ty IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (nil Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (nil Ty) [] @ ============================ exprNames CtxB (nil Ty) []
< search. Subgoal 4.23: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (cons E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (cons E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (cons E1 E2) N
< case IsE. Subgoal 4.23: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (cons E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (cons E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.23: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (cons E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (cons E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.23: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (cons E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (cons E1 E2) N
< search. Subgoal 4.24: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (head E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (head E1) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (head E1) N
< case IsE. Subgoal 4.24: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (head E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 ============================ exprNames CtxB (head E1) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.24: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (head E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : exprNames CtxB E1 N ============================ exprNames CtxB (head E1) N
< search. Subgoal 4.25: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (tail E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (tail E1) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (tail E1) N
< case IsE. Subgoal 4.25: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (tail E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 ============================ exprNames CtxB (tail E1) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.25: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (tail E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : exprNames CtxB E1 N ============================ exprNames CtxB (tail E1) N
< search. Subgoal 4.26: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (null E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (null E1) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (null E1) N
< case IsE. Subgoal 4.26: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (null E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 ============================ exprNames CtxB (null E1) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.26: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (null E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : exprNames CtxB E1 N ============================ exprNames CtxB (null E1) N
< search. Subgoal 4.27: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (index E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (index E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N ============================ exprNames CtxB (index E1 E2) N
< case IsE. Subgoal 4.27: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (index E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 ============================ exprNames CtxB (index E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.27: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (index E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 ============================ exprNames CtxB (index E1 E2) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.27: Variables: CtxA CtxB N N2 N3 E2 E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (index E1 E2) N @ EN1 : exprNames CtxA E1 N2 * EN2 : exprNames CtxA E2 N3 * EN3 : N2 ++ N3 = N H1 : is_expr E1 H2 : is_expr E2 H3 : exprNames CtxB E1 N2 H4 : exprNames CtxB E2 N3 ============================ exprNames CtxB (index E1 E2) N
< search. Subgoal 4.28: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (exactEval:list:length E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (exactEval:list:length E1) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (exactEval:list:length E1) N
< case IsE. Subgoal 4.28: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (exactEval:list:length E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 ============================ exprNames CtxB (exactEval:list:length E1) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.28: Variables: CtxA CtxB N E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (exactEval:list:length E1) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : exprNames CtxB E1 N ============================ exprNames CtxB (exactEval:list:length E1) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_increaseCtxs, exactEval:host:stmtNames_increaseCtxs_ctxs, exactEval:host:exprNames_increaseCtxs. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA ============================ mem X NA
< case IsS. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ mem X NA
< SNB: case SNB. Subgoal 1.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mem X NA
< Or: apply mem_append to M SNB3. Subgoal 1.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB Or : mem X NI1 \/ mem X NE1 ============================ mem X NA
< M': case Or. Subgoal 1.12.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 ============================ mem X NA
< MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.12.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 MI : mem X NI ============================ mem X NA
< apply mem_append_left to MI SNA4. Subgoal 1.12.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 MI : mem X NI H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.12.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 ============================ mem X NA
< MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'. Subgoal 1.12.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 MN : mem X NE ============================ mem X NA
< apply mem_append_right to MN SNA4. Subgoal 1.12.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 MN : mem X NE H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.12.2: Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X (L::N) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N ============================ mem X NA
< MB: apply RelAB to SNA1. Subgoal 1.12.2: Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mem X (L::N) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N MB : mems L (ScopeB::CtxB) ============================ mem X NA
< apply not_mems to SNB MB. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N ============================ mem X (L::N)
< case IsS. Subgoal 1.13: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ mem X (L::N)
< SNB: case SNB. Subgoal 1.13.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mem X (L::N)
< Or: apply mem_append to M SNB3. Subgoal 1.13.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB Or : mem X NI1 \/ mem X NE1 ============================ mem X (L::N)
< M': case Or. Subgoal 1.13.1.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 ============================ mem X (L::N)
< MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.13.1.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 MI : mem X NI ============================ mem X (L::N)
< apply mem_append_left to MI SNA4. Subgoal 1.13.1.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NI1 MI : mem X NI H4 : mem X N ============================ mem X (L::N)
< search. Subgoal 1.13.1.2: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 ============================ mem X (L::N)
< MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'. Subgoal 1.13.1.2: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 MN : mem X NE ============================ mem X (L::N)
< apply mem_append_right to MN SNA4. Subgoal 1.13.1.2: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X NB SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB M' : mem X NE1 MN : mem X NE H4 : mem X N ============================ mem X (L::N)
< search. Subgoal 1.13.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mem X (L::N1) SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ mem X (L::N)
< M: case M. Subgoal 1.13.2.1: Variables: ScopeA CtxA ScopeB CtxB NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ mem L (L::N)
< search. Subgoal 1.13.2.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 ============================ mem X (L::N)
< Or: apply mem_append to M SNB3. Subgoal 1.13.2.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 Or : mem X NI1 \/ mem X NE1 ============================ mem X (L::N)
< M': case Or. Subgoal 1.13.2.2.1: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NI1 ============================ mem X (L::N)
< MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.13.2.2.1: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NI1 MI : mem X NI ============================ mem X (L::N)
< apply mem_append_left to MI SNA4. Subgoal 1.13.2.2.1: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NI1 MI : mem X NI H4 : mem X N ============================ mem X (L::N)
< search. Subgoal 1.13.2.2.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NE1 ============================ mem X (L::N)
< MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'. Subgoal 1.13.2.2.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NE1 MN : mem X NE ============================ mem X (L::N)
< apply mem_append_right to MN SNA4. Subgoal 1.13.2.2.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 M : mem X N1 M' : mem X NE1 MN : mem X NE H4 : mem X N ============================ mem X (L::N)
< search. Subgoal 1.14: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA ============================ mem X NA
< case IsS. Subgoal 1.14: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body ============================ mem X NA
< SNB: case SNB. Subgoal 1.14: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB ============================ mem X NA
< Or: apply mem_append to M SNB2. Subgoal 1.14: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB Or : mem X NL1 \/ mem X NB2 ============================ mem X NA
< M': case Or. Subgoal 1.14.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NL1 ============================ mem X NA
< M'': apply IH_E to _ _ _ _ SNA1 SNB M'. Subgoal 1.14.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NL1 M'' : mem X NL ============================ mem X NA
< apply mem_append_left to M'' SNA3. Subgoal 1.14.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NL1 M'' : mem X NL H4 : mem X NA ============================ mem X NA
< search. Subgoal 1.14.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 ============================ mem X NA
< M'': apply IH_S to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.14.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 ============================ forall X1, mems X1 ([I]::(ScopeA::CtxA)) -> mems X1 ([I]::(ScopeB::CtxB))
< intros Mems. Subgoal 1.14.2.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 Mems : mems X1 ([I]::(ScopeA::CtxA)) ============================ mems X1 ([I]::(ScopeB::CtxB))
< Mems: case Mems. Subgoal 1.14.2.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 Mems : mem X1 [I] ============================ mems X1 ([I]::(ScopeB::CtxB))
< MX: case Mems. Subgoal 1.14.2.1.1.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 ============================ mems I ([I]::(ScopeB::CtxB))
< search. Subgoal 1.14.2.1.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 MX : mem X1 [] ============================ mems X1 ([I]::(ScopeB::CtxB))
< case MX. Subgoal 1.14.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 Mems : mems X1 (ScopeA::CtxA) ============================ mems X1 ([I]::(ScopeB::CtxB))
< apply RelAB to Mems. Subgoal 1.14.2.1.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 Mems : mems X1 (ScopeA::CtxA) H4 : mems X1 (ScopeB::CtxB) ============================ mems X1 ([I]::(ScopeB::CtxB))
< search. Subgoal 1.14.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 M'' : mem X NB1 ============================ mem X NA
< apply mem_append_right to M'' SNA3. Subgoal 1.14.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : is_string I H2 : is_expr L H3 : is_stmt Body SNB : exprNames (ScopeB::CtxB) L NL1 SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 SNB2 : NL1 ++ NB2 = NB M' : mem X NB2 M'' : mem X NB1 H4 : mem X NA ============================ mem X NA
< search. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 2.12.2: Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = NA H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 2.13: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listUpdate L I E) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N ============================ mems X CtxB'
< case IsS. Subgoal 2.13: Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.13.1: Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = NB ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 2.13.2: Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : not_mems L (ScopeA::CtxA) SNA2 : exprNames (ScopeA::CtxA) I NI * SNA3 : exprNames (ScopeA::CtxA) E NE * SNA4 : NI ++ NE = N H1 : is_string L H2 : is_expr I H3 : is_expr E SNB : not_mems L (ScopeB::CtxB) SNB1 : exprNames (ScopeB::CtxB) I NI1 SNB2 : exprNames (ScopeB::CtxB) E NE1 SNB3 : NI1 ++ NE1 = N1 ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 2.14: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA ============================ mems X CtxB'
< case SNB. Subgoal 2.14: Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (listForeach I L Body) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) L NL * SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 * SNA3 : NL ++ NB1 = NA H1 : exprNames (ScopeB::CtxB) L NL1 H2 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2 H3 : NL1 ++ NB2 = NB ============================ mems X (ScopeB::CtxB)
< backchain RelAB. Subgoal 3.22: Variables: CtxA CtxB NB X Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (nil Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (nil Ty) [] @ ENB : exprNames CtxB (nil Ty) NB M : mem X NB ============================ mem X []
< case ENB. Subgoal 3.22: Variables: CtxA CtxB X Ty IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (nil Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (nil Ty) [] @ M : mem X [] ============================ mem X []
< case M. Subgoal 3.23: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (cons E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ ENB : exprNames CtxB (cons E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.23: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ ENB : exprNames CtxB (cons E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.23: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.23: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.23.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.23.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.23.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.23.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.23.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.23.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (cons E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.24: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (head E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (head E1) NA @ ENB : exprNames CtxB (head E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.24: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (head E1) NA @ ENB : exprNames CtxB (head E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.24: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (head E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.24: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (head E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 3.25: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (tail E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (tail E1) NA @ ENB : exprNames CtxB (tail E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.25: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (tail E1) NA @ ENB : exprNames CtxB (tail E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.25: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (tail E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.25: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (tail E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 3.26: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (null E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (null E1) NA @ ENB : exprNames CtxB (null E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.26: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (null E1) NA @ ENB : exprNames CtxB (null E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.26: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (null E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.26: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (null E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB H2 : mem X NA ============================ mem X NA
< search. Subgoal 3.27: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (index E1 E2) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ ENB : exprNames CtxB (index E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA ============================ mem X NA
< case IsE. Subgoal 3.27: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ ENB : exprNames CtxB (index E1 E2) NB M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ============================ mem X NA
< ENB: case ENB. Subgoal 3.27: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB ============================ mem X NA
< Or: apply mem_append to M ENB2. Subgoal 3.27: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB Or : mem X N3 \/ mem X N4 ============================ mem X NA
< M': case Or. Subgoal 3.27.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 ============================ mem X NA
< M1: apply IH_E to _ _ _ _ ENA1 ENB M'. Subgoal 3.27.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA3. Subgoal 3.27.1: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N3 M1 : mem X N1 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.27.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 ============================ mem X NA
< M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'. Subgoal 3.27.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 ============================ mem X NA
< apply mem_append_right to M2 ENA3. Subgoal 3.27.2: Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (index E1 E2) NA @ M : mem X NB ENA1 : exprNames CtxA E1 N1 * ENA2 : exprNames CtxA E2 N2 * ENA3 : N1 ++ N2 = NA H1 : is_expr E1 H2 : is_expr E2 ENB : exprNames CtxB E1 N3 ENB1 : exprNames CtxB E2 N4 ENB2 : N3 ++ N4 = NB M' : mem X N4 M2 : mem X N2 H3 : mem X NA ============================ mem X NA
< search. Subgoal 3.28: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (exactEval:list:length E1) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (exactEval:list:length E1) NA @ ENB : exprNames CtxB (exactEval:list:length E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.28: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (exactEval:list:length E1) NA @ ENB : exprNames CtxB (exactEval:list:length E1) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ============================ mem X NA
< ENB: case ENB. Subgoal 3.28: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (exactEval:list:length E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.28: Variables: CtxA NA CtxB NB X E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (exactEval:list:length E1) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 ENB : exprNames CtxB E1 NB H2 : mem X NA ============================ mem X NA
< search. Proof completed.
< Theorem exprNames_mem : forall Ctx X N, mems X Ctx -> exprNames Ctx (name X) N -> N = []. ============================ forall Ctx X N, mems X Ctx -> exprNames Ctx (name X) N -> N = []
< intros M EN. Variables: Ctx X N M : mems X Ctx EN : exprNames Ctx (name X) N ============================ N = []
< EN: case EN. Subgoal 1: Variables: Ctx X M : mems X Ctx EN : mems X Ctx ============================ [] = []
< search. Subgoal 2: Variables: Ctx X M : mems X Ctx EN : not_mems X Ctx ============================ [X] = []
< apply not_mems to EN M. Proof completed.
< Prove_Constraint exactEval:host:proj_exprNames. Subgoal 1: Variables: Names Ctx N N_P X Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) N_P M : mem X N_P ============================ mem X N
< EN_P: case EN_P. Subgoal 1: Variables: Names Ctx N N_P X Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N M : mem X N_P EN_P : recFieldNames Ctx (consRecFieldExprs "null" true nilRecFieldExprs) N_P ============================ mem X N
< EN_P: case EN_P. Subgoal 1: Variables: Names Ctx N N_P X Ty EN RN Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N M : mem X N_P EN_P : exprNames Ctx true EN EN_P1 : recFieldNames Ctx nilRecFieldExprs RN EN_P2 : EN ++ RN = N_P ============================ mem X N
< EN_P: case EN_P. Subgoal 1: Variables: Names Ctx N N_P X Ty RN Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N M : mem X N_P EN_P1 : recFieldNames Ctx nilRecFieldExprs RN EN_P2 : [] ++ RN = N_P ============================ mem X N
< EN_P: case EN_P1. Subgoal 1: Variables: Names Ctx N N_P X Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N M : mem X N_P EN_P2 : [] ++ [] = N_P ============================ mem X N
< case EN_P2. Subgoal 1: Variables: Names Ctx N X Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (nil Ty) N M : mem X [] ============================ mem X N
< case M. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P M : mem X N_P ============================ mem X N
< case IsE. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (cons E1 E2) N EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 ============================ mem X N
< EN: case EN. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ mem X N
< EN_P: case EN_P. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P : recFieldNames Ctx (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) N_P ============================ mem X N
< EN_P: case EN_P. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P : exprNames Ctx false EN EN_P1 : recFieldNames Ctx (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) RN EN_P2 : EN ++ RN = N_P ============================ mem X N
< EN_P: case EN_P1. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P : exprNames Ctx false EN EN_P2 : EN ++ RN = N_P EN_P1 : exprNames Ctx E1 EN1 EN_P3 : recFieldNames Ctx (consRecFieldExprs "tail" E2 nilRecFieldExprs) RN1 EN_P4 : EN1 ++ RN1 = RN ============================ mem X N
< EN_P: case EN_P3. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN EN1 RN1 EN2 RN2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P : exprNames Ctx false EN EN_P2 : EN ++ RN = N_P EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = RN EN_P3 : exprNames Ctx E2 EN2 EN_P5 : recFieldNames Ctx nilRecFieldExprs RN2 EN_P6 : EN2 ++ RN2 = RN1 ============================ mem X N
< case EN_P. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 RN EN1 RN1 EN2 RN2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P2 : [] ++ RN = N_P EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = RN EN_P3 : exprNames Ctx E2 EN2 EN_P5 : recFieldNames Ctx nilRecFieldExprs RN2 EN_P6 : EN2 ++ RN2 = RN1 ============================ mem X N
< case EN_P5. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 RN EN1 RN1 EN2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P2 : [] ++ RN = N_P EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = RN EN_P3 : exprNames Ctx E2 EN2 EN_P6 : EN2 ++ [] = RN1 ============================ mem X N
< case EN_P2. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1 EN2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 EN2 EN_P6 : EN2 ++ [] = RN1 ============================ mem X N
< apply append_nil_right to EN_P6. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 RN1 EN_P6 : RN1 ++ [] = RN1 ============================ mem X N
< clear EN_P6. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 RN1 ============================ mem X N
< apply exprNames_unique to _ _ EN EN_P1. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 N3 EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 EN1 EN1 : exprNames Ctx E2 N3 EN2 : EN1 ++ N3 = N EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 RN1 ============================ mem X N
< apply exprNames_unique to _ _ EN1 EN_P3. Subgoal 2: Variables: Names Ctx N N_P X E2 E1 EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 EN1 EN1 : exprNames Ctx E2 RN1 EN2 : EN1 ++ RN1 = N EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 RN1 ============================ mem X N
< apply append_unique to EN2 EN_P4. Subgoal 2: Variables: Names Ctx N_P X E2 E1 EN1 RN1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 EN1 EN1 : exprNames Ctx E2 RN1 EN2 : EN1 ++ RN1 = N_P EN_P1 : exprNames Ctx E1 EN1 EN_P4 : EN1 ++ RN1 = N_P EN_P3 : exprNames Ctx E2 RN1 ============================ mem X N_P
< search. Subgoal 3: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P M : mem X N_P ============================ mem X N
< case IsE. Subgoal 3: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (null E1) N EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P M : mem X N_P H1 : is_expr E1 ============================ mem X N
< EN: case EN. Subgoal 3: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ mem X N
< EN_P: case EN_P. Subgoal 3: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P : exprNames Ctx E1 N_P ============================ mem X N
< apply exprNames_unique to _ _ EN EN_P. Subgoal 3: Variables: Names Ctx N_P X E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N_P EN_P : exprNames Ctx E1 N_P ============================ mem X N_P
< search. Subgoal 4: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P M : mem X N_P ============================ mem X N
< case IsE. Subgoal 4: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (head E1) N EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P M : mem X N_P H1 : is_expr E1 ============================ mem X N
< EN: case EN. Subgoal 4: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ mem X N
< EN_P: case EN_P. Subgoal 4: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P : exprNames Ctx E1 N_P ============================ mem X N
< apply exprNames_unique to _ _ EN EN_P. Subgoal 4: Variables: Names Ctx N_P X E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N_P EN_P : exprNames Ctx E1 N_P ============================ mem X N_P
< search. Subgoal 5: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P M : mem X N_P ============================ mem X N
< case IsE. Subgoal 5: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (tail E1) N EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P M : mem X N_P H1 : is_expr E1 ============================ mem X N
< EN: case EN. Subgoal 5: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ mem X N
< EN_P: case EN_P. Subgoal 5: Variables: Names Ctx N N_P X E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P : exprNames Ctx E1 N_P ============================ mem X N
< apply exprNames_unique to _ _ EN EN_P. Subgoal 5: Variables: Names Ctx N_P X E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P H1 : is_expr E1 EN : exprNames Ctx E1 N_P EN_P : exprNames Ctx E1 N_P ============================ mem X N_P
< search. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsE : is_expr (index Lst Index) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index Lst Index) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL ============================ mem X N
< case IsE. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (index Lst Index) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index ============================ mem X N
< EN: case EN. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N ============================ mem X N
< EN_P: case EN_P. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) NS CtxS EN_P1 : exprNames CtxS (recFieldAccess (name SaveL) "head") NE EN_P2 : NS ++ NE = N_P ============================ mem X N
< EN_P: case EN_P1. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) NS CtxS EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE ============================ mem X N
< EN_P: case EN_P. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 Ctx3 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P : stmtNames ([]::Ctx) (declare intTy SaveL Lst) N1 Ctx3 EN_P3 : stmtNames Ctx3 (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) N4 CtxS EN_P4 : N1 ++ N4 = NS ============================ mem X N
< EN_P: case EN_P. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P3 : stmtNames ([SaveL]::Ctx) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) N4 CtxS EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 ============================ mem X N
< EN_P: case EN_P3. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 Ctx1 N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : stmtNames ([SaveL]::Ctx) (declare intTy SaveI Index) N5 Ctx1 EN_P5 : stmtNames Ctx1 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) N6 CtxS EN_P6 : N5 ++ N6 = N4 ============================ mem X N
< EN_P: case EN_P3. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P5 : stmtNames ([SaveI, SaveL]::Ctx) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) N6 CtxS EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 ============================ mem X N
< EN_P: case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 Ctx2 N8 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P5 : stmtNames ([SaveI, SaveL]::Ctx) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) N7 Ctx2 EN_P7 : stmtNames Ctx2 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 ============================ mem X N
< EN_P: case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (num 0) (name SaveI)) CN EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ FN = N7 ============================ mem X N
< EN_P: case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9 N10 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ FN = N7 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (num 0) N10 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : N10 ++ N11 = CN ============================ mem X N
< case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ FN = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : [] ++ N11 = CN ============================ mem X N
< case EN_P10. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT N9 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : [] ++ N11 = CN ============================ mem X N
< EN_P: case EN_P9. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN N9 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : [] ++ N11 = CN EN_P5 : exprNames ([]::([SaveI, SaveL]::Ctx)) (errorExpr (stringLit "Die") intTy) TN ============================ mem X N
< EN_P: case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN N9 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : CN ++ TN = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : [] ++ N11 = CN EN_P5 : exprNames ([]::([SaveI, SaveL]::Ctx)) (stringLit "Die") TN ============================ mem X N
< case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN N9 N11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : CN ++ [] = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11 EN_P14 : [] ++ N11 = CN ============================ mem X N
< case EN_P14. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN N9 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : CN ++ [] = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) CN ============================ mem X N
< apply append_nil_right to EN_P11. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 N9 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : N9 ++ [] = N9 EN_P12 : N9 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N9 ============================ mem X N
< apply append_nil_right to EN_P12. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P11 : N7 ++ [] = N7 EN_P12 : N7 ++ [] = N7 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 ============================ mem X N
< clear EN_P11 EN_P12. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames CtxS (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS EN_P8 : N7 ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 ============================ mem X N
< EN_P: case EN_P7. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS NE N1 N4 N5 N6 N7 N8 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ NE = N_P EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) NE EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P8 : N7 ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N8 ============================ mem X N
< apply exprNames_mem to _ EN_P1. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS N1 N4 N5 N6 N7 N8 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : NS ++ [] = N_P EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) [] EN_P4 : N1 ++ N4 = NS EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P8 : N7 ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N8 ============================ mem X N
< apply append_nil_right to EN_P2. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N7 N8 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P2 : N_P ++ [] = N_P EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) [] EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P8 : N7 ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N8 ============================ mem X N
< clear EN_P1 EN_P2. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N7 N8 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P8 : N7 ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N8 ============================ mem X N
< apply exprNames_mem to _ EN_P13. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N8 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P8 : [] ++ N8 = N6 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) [] EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N8 ============================ mem X N
< case EN_P8. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) [] EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N6 ============================ mem X N
< clear EN_P13. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N6 ============================ mem X N
< EN_P: case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB N12 N13 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N6 EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N12 EN_P2 : exprNames ([SaveI, SaveL]::Ctx) (num 0) N13 EN_P5 : N12 ++ N13 = CN1 ============================ mem X N
< case EN_P2. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB N12 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N6 EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N12 EN_P5 : N12 ++ [] = CN1 ============================ mem X N
< apply exprNames_mem to _ EN_P1. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : CN1 ++ BN = N6 EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) [] EN_P5 : [] ++ [] = CN1 ============================ mem X N
< case EN_P5. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 BN CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB EN_P9 : [] ++ BN = N6 EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) [] ============================ mem X N
< case EN_P9. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) N6 CtxB EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) [] ============================ mem X N
< clear EN_P1. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) N6 CtxB ============================ mem X N
< EN_P: case EN_P7. Subgoal 6: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 Ctx4 N15 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N14 Ctx4 EN_P2 : stmtNames Ctx4 (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : N14 ++ N15 = N6 ============================ mem X N
< EN_P: case EN_P1. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : N14 ++ N15 = N6 EN_P1 : mems SaveL ([]::([SaveI, SaveL]::Ctx)) EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N14 ============================ mem X N
< clear EN_P1. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : N14 ++ N15 = N6 EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N14 ============================ mem X N
< EN_P: case EN_P7. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : N14 ++ N15 = N6 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) N14 ============================ mem X N
< apply exprNames_mem to _ EN_P1. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : [] ++ N15 = N6 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) [] ============================ mem X N
< case EN_P5. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N6 CtxB EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) [] ============================ mem X N
< clear EN_P1. Subgoal 6.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N6 CtxB ============================ mem X N
< EN_P: case EN_P2. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : mems SaveI ([]::([SaveI, SaveL]::Ctx)) EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N6 ============================ mem X N
< clear EN_P1. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N6 ============================ mem X N
< EN_P: case EN_P2. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N16 N17 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) N16 EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (num 1) N17 EN_P5 : N16 ++ N17 = N6 ============================ mem X N
< case EN_P2. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) N16 EN_P5 : N16 ++ [] = N6 ============================ mem X N
< apply exprNames_mem to _ EN_P1. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) [] EN_P5 : [] ++ [] = N6 ============================ mem X N
< case EN_P5. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ [] = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) [] ============================ mem X N
< clear EN_P1. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ [] = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 ============================ mem X N
< apply append_nil_right to EN_P6. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N4 ++ [] = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 ============================ mem X N
< clear EN_P6. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 ============================ mem X N
< Or: apply mem_append to M EN_P4. Subgoal 6.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 Or : mem X N1 \/ mem X N4 ============================ mem X N
< M': case Or. Subgoal 6.1.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N1 ============================ mem X N
< M2: apply exprNames_increaseCtxs to _ _ _ _ EN EN_P M'. Subgoal 6.1.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N1 M2 : mem X N2 ============================ mem X N
< apply mem_append_left to M2 EN2. Subgoal 6.1.1.1: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N1 M2 : mem X N2 H3 : mem X N ============================ mem X N
< search. Subgoal 6.1.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N4 ============================ mem X N
< apply fresh_name_is to _ Pr2. Subgoal 6.1.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N4 H3 : is_string SaveL ============================ mem X N
< M3: apply exprNames_increaseCtxs to _ _ _ _ EN1 EN_P3 M'. Subgoal 6.1.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N4 H3 : is_string SaveL M3 : mem X N3 ============================ mem X N
< apply mem_append_right to M3 EN2. Subgoal 6.1.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P3 : exprNames ([SaveL]::Ctx) Index N4 M' : mem X N4 H3 : is_string SaveL M3 : mem X N3 H4 : mem X N ============================ mem X N
< search. Subgoal 6.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ SaveI::N16 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P1 : not_mems SaveI ([]::([SaveI, SaveL]::Ctx)) EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16 ============================ mem X N
< NM: case EN_P1. Subgoal 6.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ SaveI::N16 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16 NM : not_mem SaveI [] NM1 : not_mems SaveI ([SaveI, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 6.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ SaveI::N16 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16 NM : not_mem SaveI [] NM' : not_mem SaveI [SaveI, SaveL] NM'1 : not_mems SaveI Ctx ============================ mem X N
< NM'': case NM'. Subgoal 6.1.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ SaveI::N16 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16 NM : not_mem SaveI [] NM'1 : not_mems SaveI Ctx NM'' : SaveI = SaveI -> false NM''1 : not_mem SaveI [SaveL] ============================ mem X N
< apply NM'' to _. Subgoal 6.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : SaveL::N16 ++ N15 = N6 EN_P1 : not_mems SaveL ([]::([SaveI, SaveL]::Ctx)) EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16 ============================ mem X N
< NM: case EN_P1. Subgoal 6.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : SaveL::N16 ++ N15 = N6 EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16 NM : not_mem SaveL [] NM1 : not_mems SaveL ([SaveI, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 6.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : SaveL::N16 ++ N15 = N6 EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16 NM : not_mem SaveL [] NM' : not_mem SaveL [SaveI, SaveL] NM'1 : not_mems SaveL Ctx ============================ mem X N
< NM'': case NM'. Subgoal 6.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : SaveL::N16 ++ N15 = N6 EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : SaveI = SaveL -> false NM''1 : not_mem SaveL [SaveL] ============================ mem X N
< NM''': case NM''1. Subgoal 6.2: Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N2 EN1 : exprNames Ctx Index N3 EN2 : N2 ++ N3 = N EN_P4 : N1 ++ N4 = N_P EN_P : exprNames ([]::Ctx) Lst N1 EN_P6 : N5 ++ N6 = N4 EN_P3 : exprNames ([SaveL]::Ctx) Index N5 EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB EN_P5 : SaveL::N16 ++ N15 = N6 EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : SaveI = SaveL -> false NM''' : SaveL = SaveL -> false NM'''1 : not_mem SaveL [] ============================ mem X N
< apply NM''' to _. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsE : is_expr (exactEval:list:length E1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len ============================ mem X N
< case IsE. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (exactEval:list:length E1) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 ============================ mem X N
< EN: case EN. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ mem X N
< EN_P: case EN_P. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) NS CtxS EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P ============================ mem X N
< EN_P: case EN_P. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 Ctx3 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P : stmtNames ([]::Ctx) (declare intTy SaveL E1) N2 Ctx3 EN_P3 : stmtNames Ctx3 (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) N3 CtxS EN_P4 : N2 ++ N3 = NS ============================ mem X N
< EN_P: case EN_P. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P3 : stmtNames ([SaveL]::Ctx) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) N3 CtxS EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 ============================ mem X N
< EN_P: case EN_P3. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N1 Ctx1 N4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : stmtNames ([SaveL]::Ctx) (declare intTy Len (num 0)) N1 Ctx1 EN_P5 : stmtNames Ctx1 (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS EN_P6 : N1 ++ N4 = N3 ============================ mem X N
< EN_P: case EN_P3. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N1 N4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS EN_P6 : N1 ++ N4 = N3 EN_P3 : exprNames ([SaveL]::Ctx) (num 0) N1 ============================ mem X N
< case EN_P3. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS EN_P6 : [] ++ N4 = N3 ============================ mem X N
< case EN_P6. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames CtxS (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N3 CtxS ============================ mem X N
< EN_P: case EN_P5. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : exprNames ([Len, SaveL]::Ctx) (not (recFieldAccess (name SaveL) "null")) CN EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB EN_P6 : CN ++ BN = N3 ============================ mem X N
< EN_P: case EN_P3. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB EN_P6 : CN ++ BN = N3 EN_P3 : exprNames ([Len, SaveL]::Ctx) (recFieldAccess (name SaveL) "null") CN ============================ mem X N
< EN_P: case EN_P3. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB EN_P6 : CN ++ BN = N3 EN_P3 : exprNames ([Len, SaveL]::Ctx) (name SaveL) CN ============================ mem X N
< EN_P: case EN_P5. Subgoal 7: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : CN ++ BN = N3 EN_P3 : exprNames ([Len, SaveL]::Ctx) (name SaveL) CN EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN ============================ mem X N
< M': case EN_P3. Subgoal 7.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN M' : mems SaveL ([Len, SaveL]::Ctx) ============================ mem X N
< clear M'. Subgoal 7.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN ============================ mem X N
< case EN_P6. Subgoal 7.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = N3 ============================ mem X N
< EN_P: case EN_P5. Subgoal 7.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = N3 EN_P3 : mems SaveL ([]::([Len, SaveL]::Ctx)) EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N5 ============================ mem X N
< clear EN_P3. Subgoal 7.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = N3 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N5 ============================ mem X N
< EN_P: case EN_P5. Subgoal 7.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = N3 EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name SaveL) N5 ============================ mem X N
< M': case EN_P3. Subgoal 7.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [] ++ N6 = N3 M' : mems SaveL ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< clear M'. Subgoal 7.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [] ++ N6 = N3 ============================ mem X N
< case EN_P8. Subgoal 7.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N3 CtxB ============================ mem X N
< EN_P: case EN_P7. Subgoal 7.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : mems Len ([]::([Len, SaveL]::Ctx)) EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N3 ============================ mem X N
< clear EN_P3. Subgoal 7.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N3 ============================ mem X N
< EN_P: case EN_P5. Subgoal 7.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 N7 N8 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name Len) N7 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (num 1) N8 EN_P6 : N7 ++ N8 = N3 ============================ mem X N
< case EN_P5. Subgoal 7.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name Len) N7 EN_P6 : N7 ++ [] = N3 ============================ mem X N
< EN_P: case EN_P3. Subgoal 7.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [] ++ [] = N3 EN_P3 : mems Len ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< case EN_P6. Subgoal 7.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ [] = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : mems Len ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< apply append_nil_right to EN_P4. Subgoal 7.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : NS ++ [] = NS EN_P : exprNames ([]::Ctx) E1 NS EN_P3 : mems Len ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< clear EN_P4 EN_P3. Subgoal 7.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS NE Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P : exprNames ([]::Ctx) E1 NS ============================ mem X N
< M': case EN_P1. Subgoal 7.1.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 NS Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : NS ++ [] = N_P EN_P : exprNames ([]::Ctx) E1 NS M' : mems Len ([Len, SaveL]::Ctx) ============================ mem X N
< apply append_nil_right to EN_P2. Subgoal 7.1.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : N_P ++ [] = N_P EN_P : exprNames ([]::Ctx) E1 N_P M' : mems Len ([Len, SaveL]::Ctx) ============================ mem X N
< apply exprNames_increaseCtxs to _ _ _ _ EN EN_P M. Subgoal 7.1.1.1.1.1.1: Variables: Names Ctx N N_P X Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : N_P ++ [] = N_P EN_P : exprNames ([]::Ctx) E1 N_P M' : mems Len ([Len, SaveL]::Ctx) H2 : mem X N ============================ mem X N
< search. Subgoal 7.1.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : NS ++ [Len] = N_P EN_P : exprNames ([]::Ctx) E1 NS M' : not_mems Len ([Len, SaveL]::Ctx) ============================ mem X N
< NM: case M'. Subgoal 7.1.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : NS ++ [Len] = N_P EN_P : exprNames ([]::Ctx) E1 NS NM : not_mem Len [Len, SaveL] NM1 : not_mems Len Ctx ============================ mem X N
< NM': case NM. Subgoal 7.1.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P2 : NS ++ [Len] = N_P EN_P : exprNames ([]::Ctx) E1 NS NM1 : not_mems Len Ctx NM' : Len = Len -> false NM'1 : not_mem Len [SaveL] ============================ mem X N
< apply NM' to _. Subgoal 7.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [Len] ++ [] = N3 EN_P3 : not_mems Len ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< NM: case EN_P3. Subgoal 7.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [Len] ++ [] = N3 NM : not_mem Len [] NM1 : not_mems Len ([Len, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 7.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [Len] ++ [] = N3 NM : not_mem Len [] NM' : not_mem Len [Len, SaveL] NM'1 : not_mems Len Ctx ============================ mem X N
< NM'': case NM'. Subgoal 7.1.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [Len] ++ [] = N3 NM : not_mem Len [] NM'1 : not_mems Len Ctx NM'' : Len = Len -> false NM''1 : not_mem Len [SaveL] ============================ mem X N
< apply NM'' to _. Subgoal 7.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ Len::N7 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P3 : not_mems Len ([]::([Len, SaveL]::Ctx)) EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7 ============================ mem X N
< NM: case EN_P3. Subgoal 7.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ Len::N7 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7 NM : not_mem Len [] NM1 : not_mems Len ([Len, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 7.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ Len::N7 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7 NM : not_mem Len [] NM' : not_mem Len [Len, SaveL] NM'1 : not_mems Len Ctx ============================ mem X N
< NM'': case NM'. Subgoal 7.1.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ Len::N7 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7 NM : not_mem Len [] NM'1 : not_mems Len Ctx NM'' : Len = Len -> false NM''1 : not_mem Len [SaveL] ============================ mem X N
< apply NM'' to _. Subgoal 7.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [SaveL] ++ N6 = N3 M' : not_mems SaveL ([]::([Len, SaveL]::Ctx)) ============================ mem X N
< NM: case M'. Subgoal 7.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [SaveL] ++ N6 = N3 NM : not_mem SaveL [] NM1 : not_mems SaveL ([Len, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 7.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [SaveL] ++ N6 = N3 NM : not_mem SaveL [] NM' : not_mem SaveL [Len, SaveL] NM'1 : not_mems SaveL Ctx ============================ mem X N
< NM'': case NM'. Subgoal 7.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [SaveL] ++ N6 = N3 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : Len = SaveL -> false NM''1 : not_mem SaveL [SaveL] ============================ mem X N
< NM''': case NM''1. Subgoal 7.1.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : [SaveL] ++ N6 = N3 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : Len = SaveL -> false NM''' : SaveL = SaveL -> false NM'''1 : not_mem SaveL [] ============================ mem X N
< apply NM''' to _. Subgoal 7.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : SaveL::N7 ++ N6 = N3 EN_P3 : not_mems SaveL ([]::([Len, SaveL]::Ctx)) EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7 ============================ mem X N
< NM: case EN_P3. Subgoal 7.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : SaveL::N7 ++ N6 = N3 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7 NM : not_mem SaveL [] NM1 : not_mems SaveL ([Len, SaveL]::Ctx) ============================ mem X N
< NM': case NM1. Subgoal 7.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : SaveL::N7 ++ N6 = N3 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7 NM : not_mem SaveL [] NM' : not_mem SaveL [Len, SaveL] NM'1 : not_mems SaveL Ctx ============================ mem X N
< NM'': case NM'. Subgoal 7.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : SaveL::N7 ++ N6 = N3 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : Len = SaveL -> false NM''1 : not_mem SaveL [SaveL] ============================ mem X N
< NM''': case NM''1. Subgoal 7.1.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : SaveL::N7 ++ N6 = N3 EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7 NM : not_mem SaveL [] NM'1 : not_mems SaveL Ctx NM'' : Len = SaveL -> false NM''' : SaveL = SaveL -> false NM'''1 : not_mem SaveL [] ============================ mem X N
< apply NM''' to _. Subgoal 7.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [SaveL] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN M' : not_mems SaveL ([Len, SaveL]::Ctx) ============================ mem X N
< NM: case M'. Subgoal 7.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [SaveL] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN NM : not_mem SaveL [Len, SaveL] NM1 : not_mems SaveL Ctx ============================ mem X N
< NM': case NM. Subgoal 7.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [SaveL] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN NM1 : not_mems SaveL Ctx NM' : Len = SaveL -> false NM'1 : not_mem SaveL [SaveL] ============================ mem X N
< NM'': case NM'1. Subgoal 7.2: Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 N EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE EN_P2 : NS ++ NE = N_P EN_P4 : N2 ++ N3 = NS EN_P : exprNames ([]::Ctx) E1 N2 EN_P6 : [SaveL] ++ BN = N3 EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2 EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB EN_P8 : N5 ++ N6 = BN NM1 : not_mems SaveL Ctx NM' : Len = SaveL -> false NM'' : SaveL = SaveL -> false NM''1 : not_mem SaveL [] ============================ mem X N
< apply NM'' to _. Proof completed.
< Theorem mems_append_right [X] : forall A B C (X : X), A ++ B = C -> mems X B -> mems X C. ============================ forall A B C X, A ++ B = C -> mems X B -> mems X C
< induction on 1. IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C ============================ forall A B C X, A ++ B = C @ -> mems X B -> mems X C
< intros App M. Variables: A B C X IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C App : A ++ B = C @ M : mems X B ============================ mems X C
< App: case App. Subgoal 1: Variables: C X IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C M : mems X C ============================ mems X C
< search. Subgoal 2: Variables: B X L3 H T IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C M : mems X B App : T ++ B = L3 * ============================ mems X (H::L3)
< apply IH to App M. Subgoal 2: Variables: B X L3 H T IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C M : mems X B App : T ++ B = L3 * H1 : mems X L3 ============================ mems X (H::L3)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy ============================ mem X N
< case IsS. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ mem X N
< SN: case SN. Subgoal 1.1: Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N ============================ mem X N
< SN_P: case SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mem X N
< SN_P: case SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 Ctx1 N3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveI I) N2 Ctx1 SN_P1 : stmtNames Ctx1 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2 SN_P2 : N2 ++ N3 = N_P ============================ mem X N
< SN_PI: case SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P1 : stmtNames ([SaveI]::(Scope::Ctx)) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2 SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 Ctx3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P : stmtNames ([SaveI]::(Scope::Ctx)) (declare intTy SaveE E) N1 Ctx3 SN_P1 : stmtNames Ctx3 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N4 Ctx2 SN_P3 : N1 ++ N4 = N3 ============================ mem X N
< SN_PE: case SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P1 : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N4 Ctx2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 Ctx4 N6 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 Ctx4 SN_P1 : stmtNames Ctx4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) N6 Ctx2 SN_P4 : N5 ++ N6 = N4 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 Ctx4 N6 N7 Ctx5 N8 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 Ctx4 SN_P4 : N5 ++ N6 = N4 SN_P1 : stmtNames Ctx4 (declare intTy Hold (nil intTy)) N7 Ctx5 SN_P5 : stmtNames Ctx5 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2 SN_P6 : N7 ++ N8 = N6 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N7 N8 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2 SN_P6 : N7 ++ N8 = N6 SN_P1 : exprNames (Scope1::Ctx6) (nil intTy) N7 ============================ mem X N
< case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N8 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2 SN_P6 : [] ++ N8 = N6 ============================ mem X N
< case SN_P6. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N6 Ctx2 ============================ mem X N
< SN_P: case SN_P5. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 Ctx7 N10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P1 : stmtNames ((Hold::Scope1)::Ctx6) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) N9 Ctx7 SN_P5 : stmtNames Ctx7 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) CN SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (not (eq (name SaveI) (num 0))) N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12 SN_P10 : N11 ++ N12 = CN ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (eq (name SaveI) (num 0)) N11 ============================ mem X N
< SN_P: case SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P11 : exprNames ((Hold::Scope1)::Ctx6) (num 0) N14 SN_P12 : N13 ++ N14 = N11 ============================ mem X N
< case SN_P11. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 ============================ mem X N
< SN_P: case SN_P9. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) N12 ============================ mem X N
< SN_P: case SN_P9. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 ============================ mem X N
< SN_P: case SN_P7. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 Ctx8 N16 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 Ctx8 SN_P11 : stmtNames Ctx8 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) N16 CtxB SN_P13 : N15 ++ N16 = BN ============================ mem X N
< SN_P: case SN_P11. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 Ctx8 N16 N17 Ctx9 N18 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 Ctx8 SN_P13 : N15 ++ N16 = BN SN_P11 : stmtNames Ctx8 (declare intTy Copy (name L)) N17 Ctx9 SN_P14 : stmtNames Ctx9 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N18 CtxB SN_P15 : N17 ++ N18 = N16 ============================ mem X N
< SN_P: case SN_P11. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N18 CtxB SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 ============================ mem X N
< SN_P: case SN_P14. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P16 : stmtNames Ctx11 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) N20 CtxB SN_P17 : N19 ++ N20 = N18 ============================ mem X N
< SN_P: case SN_P16. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 ============================ mem X N
< SN_P: case SN_P5. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 Ctx13 N24 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) N23 Ctx13 SN_P20 : stmtNames Ctx13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 ============================ mem X N
< SN_P: case SN_P5. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT FN CtxF N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) CN1 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF SN_P24 : CN1 ++ TN = N25 SN_P25 : N25 ++ FN = N23 ============================ mem X N
< SN_P: case SN_P5. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT FN CtxF N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF SN_P24 : CN1 ++ TN = N25 SN_P25 : N25 ++ FN = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X N
< case SN_P23. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P24 : CN1 ++ TN = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X N
< SN_P: case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ TN = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (errorExpr (stringLit "Invalid update") intTy) TN ============================ mem X N
< SN_P: case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ TN = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (stringLit "Invalid update") TN ============================ mem X N
< case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X N
< SN_P: case SN_P20. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 Ctx14 N27 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx14 SN_P22 : stmtNames Ctx14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) N27 Ctx2 SN_P23 : N26 ++ N27 = N24 ============================ mem X N
< SN_P: case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P22 : exprNames Ctx2 (not (null (name Hold))) CN2 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N27 ============================ mem X N
< SN_P: case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (null (name Hold)) CN2 ============================ mem X N
< SN_P: case SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 ============================ mem X N
< SN_P: case SN_P26. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 Ctx15 N29 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P26 : stmtNames ([]::Ctx2) (declare intTy Copy (name Hold)) N28 Ctx15 SN_P28 : stmtNames Ctx15 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N29 CtxB1 SN_P29 : N28 ++ N29 = BN1 ============================ mem X N
< SN_P: case SN_P26. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P28 : stmtNames ([Copy]::Ctx2) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N29 CtxB1 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 ============================ mem X N
< SN_P: case SN_P28. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P30 : stmtNames Ctx16 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) N31 CtxB1 SN_P31 : N30 ++ N31 = N29 ============================ mem X N
< SN_P: case SN_P30. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N5 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx). Subgoal 1.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N5 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
< A: case SN_P. Subgoal 1.1.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N5 ============================ N5 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< E: case A1. Subgoal 1.1.1.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : [] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) E : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< search. Subgoal 1.1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : [SaveI] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) E : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case E. Subgoal 1.1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : [SaveI] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N : not_mem SaveI [SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : [SaveI] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : not_mem SaveI [SaveI] ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : [SaveI] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : SaveI = SaveI -> false N3 : not_mem SaveI [] ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : SaveI::N34 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34 ============================ SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case A. Subgoal 1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : SaveI::N34 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34 N : not_mem SaveI [SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : SaveI::N34 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34 N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : not_mem SaveI [SaveI] ============================ SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P4 : SaveI::N34 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34 N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : SaveI = SaveI -> false N3 : not_mem SaveI [] ============================ SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6) SN_P4 : N5 ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N5 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx)) SN_P4 : [] ++ N6 = N4 SN_P6 : N9 ++ N10 = N6 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P4. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx)) SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N13 = []. Subgoal 1.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N13 = []
< E: case SN_P1. Subgoal 1.1.2.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.1.2.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [SaveI] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [SaveI] = []
< N: case E. Subgoal 1.1.2.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [SaveI] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem SaveI [Hold, SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ [SaveI] = []
< N: case N. Subgoal 1.1.2.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [SaveI] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : not_mem SaveI [SaveE, SaveI] ============================ [SaveI] = []
< N: case N2. Subgoal 1.1.2.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [SaveI] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : SaveE = SaveI -> false N3 : not_mem SaveI [SaveI] ============================ [SaveI] = []
< N: case N3. Subgoal 1.1.2.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P12 : [SaveI] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : SaveE = SaveI -> false N3 : SaveI = SaveI -> false N4 : not_mem SaveI [] ============================ [SaveI] = []
< apply N3 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13 SN_P12 : N13 ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N13 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : N11 ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P12 : [] ++ [] = N11 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P12. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P10 : [] ++ N12 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P10. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P1. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert CN = []. Subgoal 1.1.3: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ CN = []
< E: case SN_P9. Subgoal 1.1.3.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : [] ++ BN = N9 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.1.3.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : [L] ++ BN = N9 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = []
< N: case E. Subgoal 1.1.3.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : [L] ++ BN = N9 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem L [Hold, SaveE, SaveI] N1 : not_mems L (Scope::Ctx) ============================ [L] = []
< apply not_mems to N1 SN. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : CN ++ BN = N9 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : CN = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P8 : [] ++ BN = N9 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = BN SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P8. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P9. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N15 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.4: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N15 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P7. Subgoal 1.1.4.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N15 ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.1.4.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N34 E1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (num 1) N35 E2 : N34 ++ N35 = N15 ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case E1. Subgoal 1.1.4.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N34 E2 : N34 ++ [] = N15 ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case E. Subgoal 1.1.4.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [] ++ [] = N15 E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case E2. Subgoal 1.1.4.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : [] ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 E : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 N : not_mem SaveI [] N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 N : not_mem SaveI [] N1 : not_mem SaveI [Hold, SaveE, SaveI] N2 : not_mems SaveI (Scope::Ctx) ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : not_mem SaveI [SaveE, SaveI] ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N3. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : not_mem SaveI [SaveI] ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N4. Subgoal 1.1.4.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N15 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : SaveI = SaveI -> false N5 : not_mem SaveI [] ============================ N15 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N4 to _. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 N : not_mem SaveI [] N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 N : not_mem SaveI [] N1 : not_mem SaveI [Hold, SaveE, SaveI] N2 : not_mems SaveI (Scope::Ctx) ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : not_mem SaveI [SaveE, SaveI] ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N3. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : not_mem SaveI [SaveI] ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N4. Subgoal 1.1.4.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P13 : SaveI::N34 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : SaveI = SaveI -> false N5 : not_mem SaveI [] ============================ SaveI::N34 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N4 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10) SN_P13 : N15 ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames (Scope2::Ctx10) (name L) N17 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N15 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P13 : [] ++ N16 = N9 SN_P15 : N17 ++ N18 = N16 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P13. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P15 : N17 ++ N18 = N9 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P7. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : N17 ++ N18 = N9 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N17 = []. Subgoal 1.1.5: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : N17 ++ N18 = N9 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N17 = []
< E: case SN_P11. Subgoal 1.1.5.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : [] ++ N18 = N9 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 1.1.5.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : [L] ++ N18 = N9 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = []
< N: case E. Subgoal 1.1.5.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : [L] ++ N18 = N9 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem L [] N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = []
< N: case N1. Subgoal 1.1.5.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : [L] ++ N18 = N9 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem L [] N1 : not_mem L [Hold, SaveE, SaveI] N2 : not_mems L (Scope::Ctx) ============================ [L] = []
< apply not_mems to N2 _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : N17 ++ N18 = N9 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N17 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P15 : [] ++ N18 = N9 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [] SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N18 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P15. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [] SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N9 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P11. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N9 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N19 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.6: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N9 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N19 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< R: case SN_P14. Subgoal 1.1.6.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : N19 ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N19 ============================ N19 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case R1. Subgoal 1.1.6.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : [] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.6.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : [Hold] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.6.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : [Hold] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.6.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : [Hold] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.6.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : [Hold] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N1 to _. Subgoal 1.1.6.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : Copy::N34 ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34 ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case R. Subgoal 1.1.6.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : Copy::N34 ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34 N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.1.6.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P17 : Copy::N34 ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34 N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11 SN_P17 : N19 ++ N20 = N9 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N19 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P17 : [] ++ N20 = N9 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N20 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P17. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P14. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N21 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.7: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N21 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P16. Subgoal 1.1.7.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N21 ============================ N21 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.1.7.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : [] ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.7.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : [Copy] ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.7.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : [Copy] ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.1.7.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : [Copy] ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.1.7.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : Hold::N34 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 ============================ Hold::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.1.7.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : Hold::N34 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Hold::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.7.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : Hold::N34 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ Hold::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.7.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : Hold::N34 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ Hold::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N1 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB SN_P19 : N21 ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N21 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB SN_P19 : [] ++ N22 = N9 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P19. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P16. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N9 = [] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.8: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N9 = [] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P18. Subgoal 1.1.8.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N9 ============================ N9 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.1.8.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N9 ============================ N9 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case E. Subgoal 1.1.8.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : [] ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.8.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : [L] ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.8.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : [L] ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem L [Copy] N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.8.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : [L] ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem L [Copy] N1 : not_mem L [Hold, SaveE, SaveI] N2 : not_mems L (Scope::Ctx) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to N2 _. Subgoal 1.1.8.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : L::N34 ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34 ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.1.8.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : L::N34 ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34 N : not_mem L [Copy] N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.8.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : L::N34 ++ N10 = N4 SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34 N : not_mem L [Copy] N1 : not_mem L [Hold, SaveE, SaveI] N2 : not_mems L (Scope::Ctx) ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to N2 _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : N9 ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N9 = [] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P6 : [] ++ N10 = N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N23 ++ N24 = N10 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P6. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N23 ++ N24 = N4 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P18. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert CN1 = []. Subgoal 1.1.9: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ CN1 = []
< E: case SN_P5. Subgoal 1.1.9.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : [] ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.1.9.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : [L] ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = []
< N: case E. Subgoal 1.1.9.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : [L] ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem L [Hold, SaveE, SaveI] N1 : not_mems L (Scope::Ctx) ============================ [L] = []
< apply not_mems to N1 _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : CN1 ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : CN1 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P24 : [] ++ [] = N25 SN_P25 : N25 ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P24. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : N23 ++ N24 = N4 SN_P25 : [] ++ [] = N23 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P25. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N24 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P21 : [] ++ N24 = N4 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N24 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P21. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P5. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N26 = [] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx). Subgoal 1.1.10: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N26 = [] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
< R: case SN_P20. Subgoal 1.1.10.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : N26 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N26 ============================ N26 = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< E: case R1. Subgoal 1.1.10.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : [] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) E : mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< search. Subgoal 1.1.10.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : [SaveE] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) E : not_mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [SaveE] = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case E. Subgoal 1.1.10.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : [SaveE] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : not_mem SaveE [Hold, SaveE, SaveI] N1 : not_mems SaveE (Scope::Ctx) ============================ [SaveE] = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.1.10.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : [SaveE] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveE (Scope::Ctx) N : Hold = SaveE -> false N2 : not_mem SaveE [SaveE, SaveI] ============================ [SaveE] = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.1.10.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : [SaveE] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveE (Scope::Ctx) N : Hold = SaveE -> false N2 : SaveE = SaveE -> false N3 : not_mem SaveE [SaveI] ============================ [SaveE] = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.1.10.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : L::N34 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N34 ============================ L::N34 = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case R. Subgoal 1.1.10.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P23 : L::N34 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N34 N : not_mem L [Hold, SaveE, SaveI] N1 : not_mems L (Scope::Ctx) ============================ L::N34 = [] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply not_mems to N1 _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2 SN_P23 : N26 ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N28 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N26 = [] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [] ([Hold, SaveE, SaveI]::(Scope::Ctx)) SN_P23 : [] ++ N27 = N4 SN_P27 : CN2 ++ BN1 = N27 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P23. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [] ([Hold, SaveE, SaveI]::(Scope::Ctx)) SN_P27 : CN2 ++ BN1 = N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P20. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : CN2 ++ BN1 = N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert CN2 = []. Subgoal 1.1.11: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : CN2 ++ BN1 = N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ CN2 = []
< E: case SN_P22. Subgoal 1.1.11.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : [] ++ BN1 = N4 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.1.11.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : [Hold] ++ BN1 = N4 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case E. Subgoal 1.1.11.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : [Hold] ++ BN1 = N4 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem Hold [Hold, SaveE, SaveI] N1 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N. Subgoal 1.1.11.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : [Hold] ++ BN1 = N4 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N1 : not_mems Hold (Scope::Ctx) N : Hold = Hold -> false N2 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : CN2 ++ BN1 = N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : CN2 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P27 : [] ++ BN1 = N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) [] SN_P29 : N28 ++ N29 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P27. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) [] SN_P29 : N28 ++ N29 = N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P22. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : N28 ++ N29 = N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N28 = []. Subgoal 1.1.12: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : N28 ++ N29 = N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N28 = []
< E: case SN_P26. Subgoal 1.1.12.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [] ++ N29 = N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 1.1.12.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [Hold] ++ N29 = N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 E : not_mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = []
< N: case E. Subgoal 1.1.12.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [Hold] ++ N29 = N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem Hold [] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case N1. Subgoal 1.1.12.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [Hold] ++ N29 = N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem Hold [] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N1. Subgoal 1.1.12.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [Hold] ++ N29 = N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 N : not_mem Hold [] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N1 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : N28 ++ N29 = N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N28 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P29 : [] ++ N29 = N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) [] SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N29 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P29. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) [] SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N4 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< clear SN_P26. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N4 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< Eq: assert N30 = [] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.13: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N4 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ N30 = [] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< R: case SN_P28. Subgoal 1.1.13.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : N30 ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N30 ============================ N30 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case R1. Subgoal 1.1.13.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : [] ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.13.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : [L] ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.13.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : [L] ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem L [Copy] N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.13.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : [L] ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem L [Copy] N1 : not_mem L [Hold, SaveE, SaveI] N2 : not_mems L (Scope::Ctx) ============================ [L] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to N2 _. Subgoal 1.1.13.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : Copy::N34 ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34 ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case R. Subgoal 1.1.13.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : Copy::N34 ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34 N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.1.13.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P31 : Copy::N34 ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34 N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ Copy::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16 SN_P31 : N30 ++ N31 = N4 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 Eq : N30 = [] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P31 : [] ++ N31 = N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N31 ============================ mem X N
< case SN_P31. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N4 ============================ mem X N
< clear SN_P28. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N4 ============================ mem X N
< Eq: assert N32 = [] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.1.14: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N4 ============================ N32 = [] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P30. Subgoal 1.1.14.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N4 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N32 ============================ N32 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.1.14.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : [] ++ N33 = N4 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.1.14.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : [Copy] ++ N33 = N4 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.1.14.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : [Copy] ++ N33 = N4 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.1.14.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : [Copy] ++ N33 = N4 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.1.14.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : L::N34 ++ N33 = N4 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.1.14.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : L::N34 ++ N33 = N4 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 N : not_mem L [Copy] N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.1.14.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : L::N34 ++ N33 = N4 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34 N : not_mem L [Copy] N1 : not_mem L [Hold, SaveE, SaveI] N2 : not_mems L (Scope::Ctx) ============================ L::N34 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to N2 _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : N32 ++ N33 = N4 Eq : N32 = [] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1 SN_P33 : [] ++ N33 = N4 ============================ mem X N
< case SN_P33. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1 ============================ mem X N
< clear SN_P30. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1 ============================ mem X N
< Eq: assert N4 = []. Subgoal 1.1.15: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1 ============================ N4 = []
< A: case SN_P32. Subgoal 1.1.15.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N4 ============================ N4 = []
< E: case A1. Subgoal 1.1.15.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N4 ============================ N4 = []
< E: case E. Subgoal 1.1.15.1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 1.1.15.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = []
< N: case E. Subgoal 1.1.15.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case N1. Subgoal 1.1.15.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N1. Subgoal 1.1.15.1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N1 to _. Subgoal 1.1.15.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ Hold::N34 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34 ============================ Hold::N34 = []
< N: case A. Subgoal 1.1.15.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ Hold::N34 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34 N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Hold::N34 = []
< N: case N1. Subgoal 1.1.15.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ Hold::N34 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34 N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ Hold::N34 = []
< N: case N1. Subgoal 1.1.15.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ Hold::N34 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34 N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ Hold::N34 = []
< apply N1 to _. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ N4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1 Eq : N4 = [] ============================ mem X N
< case Eq. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N1 ++ [] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1 ============================ mem X N
< apply append_nil_right to SN_P3. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N3 ++ [] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1 ============================ mem X N
< clear SN_P3 SN_P32. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 ============================ mem X N
< Or: apply mem_append to M SN_P2. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 Or : mem X N2 \/ mem X N3 ============================ mem X N
< M': case Or. Subgoal 1.1.16: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N2 ============================ mem X N
< MI: apply exprNames_increaseCtxs to _ _ _ _ SN1 SN_PI M'. Subgoal 1.1.16: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N2 MI : mem X NI ============================ mem X N
< apply mem_append_left to MI SN3. Subgoal 1.1.16: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N2 MI : mem X NI H4 : mem X N ============================ mem X N
< search. Subgoal 1.1.17: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N3 ============================ mem X N
< apply fresh_name_is to _ Pr1. Subgoal 1.1.17: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N3 H4 : is_string SaveI ============================ mem X N
< ME: apply exprNames_increaseCtxs to _ _ _ _ SN2 SN_PE M'. Subgoal 1.1.17: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N3 H4 : is_string SaveI ME : mem X NE ============================ mem X N
< apply mem_append_right to ME SN3. Subgoal 1.1.17: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3 M' : mem X N3 H4 : is_string SaveI ME : mem X NE H5 : mem X N ============================ mem X N
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 ============================ mem X (L::N1)
< apply fresh_name_is to _ Pr1. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI ============================ mem X (L::N1)
< apply fresh_name_is to _ Pr2. Subgoal 1.2.1: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI ============================ is_string "Hold"
< search 6. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold ============================ mem X (L::N1)
< NotI: assert L = SaveI -> false. Subgoal 1.2.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold ============================ L = SaveI -> false
< intros E. Subgoal 1.2.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold E : L = SaveI ============================ false
< case E. Subgoal 1.2.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false ============================ mem X (L::N1)
< NotHold: assert L = Hold -> false. Subgoal 1.2.3: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false ============================ L = Hold -> false
< intros E. Subgoal 1.2.3: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false E : L = Hold ============================ false
< case E. Subgoal 1.2.3: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false ============================ false
< apply fresh_name_not_mem to Pr2 _. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false ============================ mem X (L::N1)
< NotE: assert L = SaveE -> false. Subgoal 1.2.4: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false ============================ L = SaveE -> false
< intros E. Subgoal 1.2.4: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false E : L = SaveE ============================ false
< case E. Subgoal 1.2.4: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false ============================ false
< apply fresh_name_not_mem to Pr3 _. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false ============================ mem X (L::N1)
< NotCopy: assert L = Copy -> false. Subgoal 1.2.5: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false ============================ L = Copy -> false
< intros E. Subgoal 1.2.5: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false E : L = Copy ============================ false
< case E. Subgoal 1.2.5: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (Copy::Names) SaveI Pr2 : fresh_name "Hold" (Copy::Names) Hold Pr3 : fresh_name "E" (Copy::Names) SaveE Pr4 : fresh_name "C" (Copy::Names) Copy H1 : is_string Copy H2 : is_expr I H3 : is_expr E SN : not_mems Copy (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Copy = SaveI -> false NotHold : Copy = Hold -> false NotE : Copy = SaveE -> false ============================ false
< apply fresh_name_not_mem to Pr4 _. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false ============================ mem X (L::N1)
< SN_P: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mem X (L::N1)
< SN_P: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 Ctx1 N3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveI I) N2 Ctx1 SN_P1 : stmtNames Ctx1 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2 SN_P2 : N2 ++ N3 = N_P ============================ mem X (L::N1)
< SN_PI: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P1 : stmtNames ([SaveI]::(Scope::Ctx)) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2 SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 Ctx3 N5 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P : stmtNames ([SaveI]::(Scope::Ctx)) (declare intTy SaveE E) N4 Ctx3 SN_P1 : stmtNames Ctx3 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N5 Ctx2 SN_P3 : N4 ++ N5 = N3 ============================ mem X (L::N1)
< SN_PE: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P1 : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N5 Ctx2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 Ctx4 N7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 Ctx4 SN_P1 : stmtNames Ctx4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) N7 Ctx2 SN_P4 : N6 ++ N7 = N5 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 Ctx4 N7 N8 Ctx5 N9 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 Ctx4 SN_P4 : N6 ++ N7 = N5 SN_P1 : stmtNames Ctx4 (declare intTy Hold (nil intTy)) N8 Ctx5 SN_P5 : stmtNames Ctx5 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2 SN_P6 : N8 ++ N9 = N7 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N8 N9 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2 SN_P6 : N8 ++ N9 = N7 SN_P1 : exprNames (Scope1::Ctx6) (nil intTy) N8 ============================ mem X (L::N1)
< case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N9 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2 SN_P6 : [] ++ N9 = N7 ============================ mem X (L::N1)
< case SN_P6. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N7 Ctx2 ============================ mem X (L::N1)
< SN_P: case SN_P5. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 Ctx7 N11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P1 : stmtNames ((Hold::Scope1)::Ctx6) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) N10 Ctx7 SN_P5 : stmtNames Ctx7 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) CN SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (not (eq (name SaveI) (num 0))) N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13 SN_P10 : N12 ++ N13 = CN ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (eq (name SaveI) (num 0)) N12 ============================ mem X (L::N1)
< SN_P: case SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N15 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P11 : exprNames ((Hold::Scope1)::Ctx6) (num 0) N15 SN_P12 : N14 ++ N15 = N12 ============================ mem X (L::N1)
< case SN_P11. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 ============================ mem X (L::N1)
< SN_P: case SN_P9. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) N13 ============================ mem X (L::N1)
< SN_P: case SN_P9. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 ============================ mem X (L::N1)
< SN_P: case SN_P7. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 Ctx8 N17 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 Ctx8 SN_P11 : stmtNames Ctx8 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) N17 CtxB SN_P13 : N16 ++ N17 = BN ============================ mem X (L::N1)
< SN_P: case SN_P11. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 Ctx8 N17 N18 Ctx9 N19 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 Ctx8 SN_P13 : N16 ++ N17 = BN SN_P11 : stmtNames Ctx8 (declare intTy Copy (name L)) N18 Ctx9 SN_P14 : stmtNames Ctx9 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N19 CtxB SN_P15 : N18 ++ N19 = N17 ============================ mem X (L::N1)
< SN_P: case SN_P11. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N19 CtxB SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 ============================ mem X (L::N1)
< SN_P: case SN_P14. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P16 : stmtNames Ctx11 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) N21 CtxB SN_P17 : N20 ++ N21 = N19 ============================ mem X (L::N1)
< SN_P: case SN_P16. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 ============================ mem X (L::N1)
< SN_P: case SN_P5. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 Ctx13 N25 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) N24 Ctx13 SN_P20 : stmtNames Ctx13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 ============================ mem X (L::N1)
< SN_P: case SN_P5. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT FN CtxF N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) CN1 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF SN_P24 : CN1 ++ TN = N26 SN_P25 : N26 ++ FN = N24 ============================ mem X (L::N1)
< SN_P: case SN_P5. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT FN CtxF N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF SN_P24 : CN1 ++ TN = N26 SN_P25 : N26 ++ FN = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X (L::N1)
< case SN_P23. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT SN_P24 : CN1 ++ TN = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X (L::N1)
< SN_P: case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ TN = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (errorExpr (stringLit "Invalid update") intTy) TN ============================ mem X (L::N1)
< SN_P: case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ TN = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (stringLit "Invalid update") TN ============================ mem X (L::N1)
< case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 ============================ mem X (L::N1)
< SN_P: case SN_P20. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 Ctx14 N28 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx14 SN_P22 : stmtNames Ctx14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) N28 Ctx2 SN_P23 : N27 ++ N28 = N25 ============================ mem X (L::N1)
< SN_P: case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P22 : exprNames Ctx2 (not (null (name Hold))) CN2 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N28 ============================ mem X (L::N1)
< SN_P: case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (null (name Hold)) CN2 ============================ mem X (L::N1)
< SN_P: case SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 ============================ mem X (L::N1)
< SN_P: case SN_P26. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 Ctx15 N30 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P26 : stmtNames ([]::Ctx2) (declare intTy Copy (name Hold)) N29 Ctx15 SN_P28 : stmtNames Ctx15 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N30 CtxB1 SN_P29 : N29 ++ N30 = BN1 ============================ mem X (L::N1)
< SN_P: case SN_P26. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P28 : stmtNames ([Copy]::Ctx2) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N30 CtxB1 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 ============================ mem X (L::N1)
< SN_P: case SN_P28. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P30 : stmtNames Ctx16 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) N32 CtxB1 SN_P31 : N31 ++ N32 = N30 ============================ mem X (L::N1)
< SN_P: case SN_P30. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N6 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx). Subgoal 1.2.6: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N6 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
< A: case SN_P. Subgoal 1.2.6.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N6 ============================ N6 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< E: case A1. Subgoal 1.2.6.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : [] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) E : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< search. Subgoal 1.2.6.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : [SaveI] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) E : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case E. Subgoal 1.2.6.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : [SaveI] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N : not_mem SaveI [SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.2.6.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : [SaveI] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : not_mem SaveI [SaveI] ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.2.6.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : [SaveI] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : SaveI = SaveI -> false N3 : not_mem SaveI [] ============================ [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.2.6.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : SaveI::N35 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx)) A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35 ============================ SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case A. Subgoal 1.2.6.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : SaveI::N35 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35 N : not_mem SaveI [SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.2.6.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : SaveI::N35 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35 N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : not_mem SaveI [SaveI] ============================ SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.2.6.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P4 : SaveI::N35 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35 N1 : not_mems SaveI (Scope::Ctx) N : SaveE = SaveI -> false N2 : SaveI = SaveI -> false N3 : not_mem SaveI [] ============================ SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6) SN_P4 : N6 ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13 SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1 SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N6 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx)) SN_P4 : [] ++ N7 = N5 SN_P6 : N10 ++ N11 = N7 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P4. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx)) SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N14 = []. Subgoal 1.2.7: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N14 = []
< E: case SN_P1. Subgoal 1.2.7.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.2.7.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [SaveI] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [SaveI] = []
< N: case E. Subgoal 1.2.7.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [SaveI] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N : not_mem SaveI [Hold, SaveE, SaveI] N1 : not_mems SaveI (Scope::Ctx) ============================ [SaveI] = []
< N: case N. Subgoal 1.2.7.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [SaveI] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : not_mem SaveI [SaveE, SaveI] ============================ [SaveI] = []
< N: case N2. Subgoal 1.2.7.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [SaveI] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : SaveE = SaveI -> false N3 : not_mem SaveI [SaveI] ============================ [SaveI] = []
< N: case N3. Subgoal 1.2.7.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P12 : [SaveI] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N1 : not_mems SaveI (Scope::Ctx) N : Hold = SaveI -> false N2 : SaveE = SaveI -> false N3 : SaveI = SaveI -> false N4 : not_mem SaveI [] ============================ [SaveI] = []
< apply N3 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14 SN_P12 : N14 ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N14 = [] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : N12 ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P12 : [] ++ [] = N12 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P12. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P10 : [] ++ N13 = CN SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P10. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) [] SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P1. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert CN = [L]. Subgoal 1.2.8: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ CN = [L]
< E: case SN_P9. Subgoal 1.2.8.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [L]
< M': case E. Subgoal 1.2.8.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [Hold, SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.8.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name Hold) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign Hold (tail (name Hold))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [Hold]
< apply NotHold to _. Subgoal 1.2.8.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.8.1.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name SaveE) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign SaveE (tail (name SaveE))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveE]
< apply NotE to _. Subgoal 1.2.8.1.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.8.1.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name SaveI) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign SaveI (tail (name SaveI))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveI]
< apply NotI to _. Subgoal 1.2.8.1.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [] ============================ [] = [L]
< case M'. Subgoal 1.2.8.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mems L (Scope::Ctx) ============================ [] = [L]
< apply not_mems to SN _. Subgoal 1.2.8.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [L] ++ BN = N10 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [L]
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : CN ++ BN = N10 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : CN = [L] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : N10 ++ N11 = N5 SN_P8 : [L] ++ BN = N10 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P8. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = BN SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ BN = L3 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P9. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N16 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.9: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N16 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P7. Subgoal 1.2.9.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N16 ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.2.9.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 N36 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N35 E1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (num 1) N36 E2 : N35 ++ N36 = N16 ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case E1. Subgoal 1.2.9.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N35 E2 : N35 ++ [] = N16 ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case E. Subgoal 1.2.9.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [] ++ [] = N16 E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case E2. Subgoal 1.2.9.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : [] ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 E : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 N : not_mem SaveI [] N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 N : not_mem SaveI [] N1 : not_mem SaveI [Hold, SaveE, SaveI] N2 : not_mems SaveI (Scope::Ctx) ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : not_mem SaveI [SaveE, SaveI] ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N3. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : not_mem SaveI [SaveI] ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N4. Subgoal 1.2.9.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E2 : [SaveI] ++ [] = N16 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : SaveI = SaveI -> false N5 : not_mem SaveI [] ============================ N16 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N4 to _. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 N : not_mem SaveI [] N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 N : not_mem SaveI [] N1 : not_mem SaveI [Hold, SaveE, SaveI] N2 : not_mems SaveI (Scope::Ctx) ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : not_mem SaveI [SaveE, SaveI] ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N3. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : not_mem SaveI [SaveI] ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N4. Subgoal 1.2.9.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P13 : SaveI::N35 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35 N : not_mem SaveI [] N2 : not_mems SaveI (Scope::Ctx) N1 : Hold = SaveI -> false N3 : SaveE = SaveI -> false N4 : SaveI = SaveI -> false N5 : not_mem SaveI [] ============================ SaveI::N35 = [] /\ []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N4 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10) SN_P13 : N16 ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames (Scope2::Ctx10) (name L) N18 SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N16 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P13 : [] ++ N17 = L3 SN_P15 : N18 ++ N19 = N17 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P13. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P15 : N18 ++ N19 = L3 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P7. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : N18 ++ N19 = L3 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N18 = [L]. Subgoal 1.2.10: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : N18 ++ N19 = L3 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N18 = [L]
< E: case SN_P11. Subgoal 1.2.10.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [L]
< M': case E. Subgoal 1.2.10.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [] ============================ [] = [L]
< case M'. Subgoal 1.2.10.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [L]
< M': case M'. Subgoal 1.2.10.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [Hold, SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.10.1.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : Hold::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign Hold (tail (name Hold))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [Hold]
< apply NotHold to _. Subgoal 1.2.10.1.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.10.1.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : SaveE::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign SaveE (tail (name SaveE))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveE]
< apply NotE to _. Subgoal 1.2.10.1.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.10.1.2.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : SaveI::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign SaveI (tail (name SaveI))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveI]
< apply NotI to _. Subgoal 1.2.10.1.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [] ============================ [] = [L]
< case M'. Subgoal 1.2.10.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mems L (Scope::Ctx) ============================ [] = [L]
< apply not_mems to SN _. Subgoal 1.2.10.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [L] ++ N19 = L3 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [L]
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : N18 ++ N19 = L3 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N18 = [L] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::L3 ++ N11 = N5 SN_P15 : [L] ++ N19 = L3 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L] SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P15. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L] SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = N19 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ N19 = L1 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L] SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = L1 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P11. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = L1 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N20 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.11: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = L1 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N20 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< R: case SN_P14. Subgoal 1.2.11.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : N20 ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N20 ============================ N20 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case R1. Subgoal 1.2.11.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : [] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2.11.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : [Hold] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.2.11.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : [Hold] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.11.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : [Hold] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.11.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : [Hold] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N1 to _. Subgoal 1.2.11.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : Copy::N35 ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35 ============================ Copy::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case R. Subgoal 1.2.11.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : Copy::N35 ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35 N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Copy::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.2.11.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P17 : Copy::N35 ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35 N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ Copy::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11 SN_P17 : N20 ++ N21 = L1 SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N20 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P17 : [] ++ N21 = L1 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = N21 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P17. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P14. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N22 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.12: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N22 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P16. Subgoal 1.2.12.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N22 ============================ N22 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.2.12.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : [] ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2.12.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : [Copy] ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.2.12.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : [Copy] ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.2.12.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : [Copy] ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ [Copy] = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.2.12.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : Hold::N35 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35 ============================ Hold::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case A. Subgoal 1.2.12.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : Hold::N35 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35 N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Hold::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.12.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : Hold::N35 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35 N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ Hold::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N1. Subgoal 1.2.12.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : Hold::N35 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35 N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ Hold::N35 = [] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N1 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12 SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB SN_P19 : N22 ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N22 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB SN_P19 : [] ++ N23 = L1 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P19. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P16. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert L1 = [L, L] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.13: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ L1 = [L, L] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P18. Subgoal 1.2.13.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case A. Subgoal 1.2.13.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [Copy] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Copy::Names) SaveI Pr2 : fresh_name "Hold" (Copy::Names) Hold Pr3 : fresh_name "E" (Copy::Names) SaveE Pr4 : fresh_name "C" (Copy::Names) Copy H1 : is_string Copy H2 : is_expr I H3 : is_expr E SN : not_mems Copy (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Copy = SaveI -> false NotHold : Copy = Hold -> false NotE : Copy = SaveE -> false NotCopy : Copy = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : Copy::(Copy::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Copy) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Copy ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Copy)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Copy (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Copy)) L1 ============================ L1 = [Copy, Copy] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotCopy to _. Subgoal 1.2.13.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.13.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [Hold, SaveE, SaveI] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.1.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : Hold::(Hold::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) L1 ============================ L1 = [Hold, Hold] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotHold to _. Subgoal 1.2.13.1.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [SaveE, SaveI] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.1.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : SaveE::(SaveE::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name SaveE)) L1 ============================ L1 = [SaveE, SaveE] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotE to _. Subgoal 1.2.13.1.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [SaveI] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.1.2.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : SaveI::(SaveI::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name SaveI)) L1 ============================ L1 = [SaveI, SaveI] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotI to _. Subgoal 1.2.13.1.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mem L [] ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.13.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1 M' : mems L (Scope::Ctx) ============================ L1 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to _ M'. Subgoal 1.2.13.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::(L::N35)) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N35 ============================ L::N35 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.2.13.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::(L::N35)) ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35 ============================ L::N35 = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case E. Subgoal 1.2.13.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case E. Subgoal 1.2.13.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [Copy] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.2.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Copy::Names) SaveI Pr2 : fresh_name "Hold" (Copy::Names) Hold Pr3 : fresh_name "E" (Copy::Names) SaveE Pr4 : fresh_name "C" (Copy::Names) Copy H1 : is_string Copy H2 : is_expr I H3 : is_expr E SN : not_mems Copy (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Copy = SaveI -> false NotHold : Copy = Hold -> false NotE : Copy = SaveE -> false NotCopy : Copy = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [Copy, Copy, Copy] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Copy) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Copy ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Copy)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Copy (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Copy] = [Copy, Copy] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotCopy to _. Subgoal 1.2.13.2.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.13.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [Hold, SaveE, SaveI] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.2.1.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [Hold, Hold, Hold] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = [Hold, Hold] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotHold to _. Subgoal 1.2.13.2.1.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [SaveE, SaveI] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.2.1.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [SaveE, SaveE, SaveE] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems SaveE ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [SaveE] = [SaveE, SaveE] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotE to _. Subgoal 1.2.13.2.1.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [SaveI] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.13.2.1.2.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [SaveI, SaveI, SaveI] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems SaveI ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [SaveI] = [SaveI, SaveI] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotI to _. Subgoal 1.2.13.2.1.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [] ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.13.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mems L (Scope::Ctx) ============================ [L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to _ M'. Subgoal 1.2.13.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L, L] ++ N11 = N5 SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L, L] = [L, L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : L::(L::L1) ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : L1 = [L, L] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ N5 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P6 : [L, L, L, L] ++ N11 = N5 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P6. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::L4 = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [L, L, L] ++ N11 = L4 ============================ mem X (L::N1)
< App: case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L5 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::L5) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [L, L] ++ N11 = L5 ============================ mem X (L::N1)
< App: case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L6 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::L6)) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [L] ++ N11 = L6 ============================ mem X (L::N1)
< App: case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = N11 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ N11 = L7 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P21 : N24 ++ N25 = L7 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P18. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert CN1 = [L]. Subgoal 1.2.14: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ CN1 = [L]
< E: case SN_P5. Subgoal 1.2.14.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [L]
< M': case E. Subgoal 1.2.14.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [Hold, SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.14.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [Hold]
< apply NotHold to _. Subgoal 1.2.14.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveE, SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.14.1.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveE]
< apply NotE to _. Subgoal 1.2.14.1.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [SaveI] ============================ [] = [L]
< M': case M'. Subgoal 1.2.14.1.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ [] = [SaveI]
< apply NotI to _. Subgoal 1.2.14.1.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mem L [] ============================ [] = [L]
< case M'. Subgoal 1.2.14.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 M' : mems L (Scope::Ctx) ============================ [] = [L]
< apply not_mems to _ M'. Subgoal 1.2.14.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [L] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [L]
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : CN1 ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : CN1 = [L] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P24 : [L] ++ [] = N26 SN_P25 : N26 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P24. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 L8 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P25 : L::L8 ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ [] = L8 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : N24 ++ N25 = L7 SN_P25 : [L] ++ [] = N24 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P25. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 L9 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : L::L9 ++ N25 = L7 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ [] = L9 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P21 : [L] ++ N25 = L7 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P21. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = N25 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ N25 = L10 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L] SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P5. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N27 = [L] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx). Subgoal 1.2.15: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N27 = [L] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
< R: case SN_P20. Subgoal 1.2.15.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< M': case R. Subgoal 1.2.15.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 M' : mem L [Hold, SaveE, SaveI] ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< M': case M'. Subgoal 1.2.15.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 ============================ N27 = [Hold] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply NotHold to _. Subgoal 1.2.15.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 M' : mem L [SaveE, SaveI] ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< M': case M'. Subgoal 1.2.15.1.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 ============================ N27 = [SaveE] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply NotE to _. Subgoal 1.2.15.1.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 M' : mem L [SaveI] ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< M': case M'. Subgoal 1.2.15.1.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 ============================ N27 = [SaveI] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply NotI to _. Subgoal 1.2.15.1.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 M' : mem L [] ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< case M'. Subgoal 1.2.15.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27 M' : mems L (Scope::Ctx) ============================ N27 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply not_mems to _ M'. Subgoal 1.2.15.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : L::N35 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N35 ============================ L::N35 = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< E: case R1. Subgoal 1.2.15.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : [L] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) E : mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L] = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< search. Subgoal 1.2.15.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : [L, SaveE] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) E : not_mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L, SaveE] = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case E. Subgoal 1.2.15.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : [L, SaveE] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : not_mem SaveE [Hold, SaveE, SaveI] N1 : not_mems SaveE (Scope::Ctx) ============================ [L, SaveE] = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case N. Subgoal 1.2.15.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : [L, SaveE] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveE (Scope::Ctx) N : Hold = SaveE -> false N2 : not_mem SaveE [SaveE, SaveI] ============================ [L, SaveE] = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< N: case N2. Subgoal 1.2.15.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P23 : [L, SaveE] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) N1 : not_mems SaveE (Scope::Ctx) N : Hold = SaveE -> false N2 : SaveE = SaveE -> false N3 : not_mem SaveE [SaveI] ============================ [L, SaveE] = [L] /\ [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
< apply N2 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2 SN_P23 : N27 ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames Ctx2 (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::Ctx2) (name Hold) N29 SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N27 = [L] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx)) SN_P23 : [L] ++ N28 = L10 SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P23. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx)) SN_P27 : CN2 ++ BN1 = N28 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ N28 = L11 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx)) SN_P27 : CN2 ++ BN1 = L11 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P20. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : CN2 ++ BN1 = L11 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert CN2 = []. Subgoal 1.2.16: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : CN2 ++ BN1 = L11 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ CN2 = []
< E: case SN_P22. Subgoal 1.2.16.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : [] ++ BN1 = L11 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 1.2.16.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : [Hold] ++ BN1 = L11 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case E. Subgoal 1.2.16.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : [Hold] ++ BN1 = L11 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N : not_mem Hold [Hold, SaveE, SaveI] N1 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N. Subgoal 1.2.16.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : [Hold] ++ BN1 = L11 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N1 : not_mems Hold (Scope::Ctx) N : Hold = Hold -> false N2 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : CN2 ++ BN1 = L11 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2 SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : CN2 = [] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P27 : [] ++ BN1 = L11 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) [] SN_P29 : N29 ++ N30 = BN1 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P27. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) [] SN_P29 : N29 ++ N30 = L11 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P22. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : N29 ++ N30 = L11 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N29 = []. Subgoal 1.2.17: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : N29 ++ N30 = L11 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N29 = []
< E: case SN_P26. Subgoal 1.2.17.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [] ++ N30 = L11 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 1.2.17.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [Hold] ++ N30 = L11 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 E : not_mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = []
< N: case E. Subgoal 1.2.17.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [Hold] ++ N30 = L11 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N : not_mem Hold [] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case N1. Subgoal 1.2.17.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [Hold] ++ N30 = L11 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N : not_mem Hold [] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N1. Subgoal 1.2.17.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [Hold] ++ N30 = L11 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 N : not_mem Hold [] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N1 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : N29 ++ N30 = L11 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N29 = [] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P29 : [] ++ N30 = L11 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) [] SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = N30 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< case SN_P29. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) [] SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = L11 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< clear SN_P26. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = L11 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< Eq: assert N31 = [L] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.18: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = L11 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ N31 = [L] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< R: case SN_P28. Subgoal 1.2.18.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : N31 ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N31 ============================ N31 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case R1. Subgoal 1.2.18.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case E. Subgoal 1.2.18.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [Copy] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.18.1.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Copy::Names) SaveI Pr2 : fresh_name "Hold" (Copy::Names) Hold Pr3 : fresh_name "E" (Copy::Names) SaveE Pr4 : fresh_name "C" (Copy::Names) Copy H1 : is_string Copy H2 : is_expr I H3 : is_expr E SN : not_mems Copy (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Copy = SaveI -> false NotHold : Copy = Hold -> false NotE : Copy = SaveE -> false NotCopy : Copy = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Copy::(Copy::(Copy::(Copy::(Copy::(Copy::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Copy (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [Copy] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotCopy to _. Subgoal 1.2.18.1.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.18.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.18.1.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [Hold, SaveE, SaveI] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.18.1.1.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::(Hold::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [Hold] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotHold to _. Subgoal 1.2.18.1.1.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [SaveE, SaveI] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.18.1.1.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveE (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [SaveE] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotE to _. Subgoal 1.2.18.1.1.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [SaveI] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.18.1.1.2.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = [SaveI] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotI to _. Subgoal 1.2.18.1.1.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mem L [] ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.18.1.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) M' : mems L (Scope::Ctx) ============================ [] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to _ M'. Subgoal 1.2.18.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : [L] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2.18.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : Copy::N35 ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35 ============================ Copy::N35 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case R. Subgoal 1.2.18.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : Copy::N35 ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35 N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Copy::N35 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.2.18.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P31 : Copy::N35 ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35 N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ Copy::N35 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16 SN_P31 : N31 ++ N32 = L11 SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 Eq : N31 = [L] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P31 : [L] ++ N32 = L11 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 ============================ mem X (L::N1)
< App: case SN_P31. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = N32 App : [] ++ N32 = L12 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 ============================ mem X (L::N1)
< clear SN_P28. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 ============================ mem X (L::N1)
< Eq: assert N33 = [L] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)). Subgoal 1.2.19: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 ============================ N33 = [L] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< A: case SN_P30. Subgoal 1.2.19.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case A. Subgoal 1.2.19.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [Copy] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.19.1.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Copy::Names) SaveI Pr2 : fresh_name "Hold" (Copy::Names) Hold Pr3 : fresh_name "E" (Copy::Names) SaveE Pr4 : fresh_name "C" (Copy::Names) Copy H1 : is_string Copy H2 : is_expr I H3 : is_expr E SN : not_mems Copy (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Copy = SaveI -> false NotHold : Copy = Hold -> false NotE : Copy = SaveE -> false NotCopy : Copy = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Copy::(Copy::(Copy::(Copy::(Copy::(Copy::(Copy::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 ============================ N33 = [Copy] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotCopy to _. Subgoal 1.2.19.1.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.19.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.19.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [Hold, SaveE, SaveI] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.19.1.2.1.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E SN : not_mems Hold (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : Hold = SaveI -> false NotHold : Hold = Hold -> false NotE : Hold = SaveE -> false NotCopy : Hold = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::(Hold::(Hold::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 ============================ N33 = [Hold] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotHold to _. Subgoal 1.2.19.1.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [SaveE, SaveI] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.19.1.2.1.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E SN : not_mems SaveE (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveE = SaveI -> false NotHold : SaveE = Hold -> false NotE : SaveE = SaveE -> false NotCopy : SaveE = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 ============================ N33 = [SaveE] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotE to _. Subgoal 1.2.19.1.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [SaveI] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< M': case M'. Subgoal 1.2.19.1.2.1.2.2.1: Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E SN : not_mems SaveI (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : SaveI = SaveI -> false NotHold : SaveI = Hold -> false NotE : SaveI = SaveE -> false NotCopy : SaveI = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 ============================ N33 = [SaveI] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply NotI to _. Subgoal 1.2.19.1.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mem L [] ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< case M'. Subgoal 1.2.19.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33 M' : mems L (Scope::Ctx) ============================ N33 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply not_mems to _ M'. Subgoal 1.2.19.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : L::N35 ++ N34 = L12 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35 ============================ L::N35 = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< E: case A1. Subgoal 1.2.19.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : [L] ++ N34 = L12 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< search. Subgoal 1.2.19.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : [L, Copy] ++ N34 = L12 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [L, Copy] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case E. Subgoal 1.2.19.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : [L, Copy] ++ N34 = L12 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Copy [Copy] N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [L, Copy] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< N: case N. Subgoal 1.2.19.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : [L, Copy] ++ N34 = L12 A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx)) N : Copy = Copy -> false N2 : not_mem Copy [] ============================ [L, Copy] = [L] /\ [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
< apply N to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17 SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : N33 ++ N34 = L12 Eq : N33 = [L] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 SN_P33 : [L] ++ N34 = L12 ============================ mem X (L::N1)
< App: case SN_P33. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1 App : [] ++ N34 = L13 ============================ mem X (L::N1)
< case App. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1 ============================ mem X (L::N1)
< clear SN_P30. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1 ============================ mem X (L::N1)
< Eq: assert L13 = []. Subgoal 1.2.20: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1 ============================ L13 = []
< A: case SN_P32. Subgoal 1.2.20.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) L13 ============================ L13 = []
< E: case A1. Subgoal 1.2.20.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) L13 ============================ L13 = []
< E: case E. Subgoal 1.2.20.1.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 1.2.20.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) ============================ [Hold] = []
< N: case E. Subgoal 1.2.20.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ [Hold] = []
< N: case N1. Subgoal 1.2.20.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ [Hold] = []
< N: case N1. Subgoal 1.2.20.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ [Hold] = []
< apply N1 to _. Subgoal 1.2.20.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35 ============================ Hold::N35 = []
< N: case A. Subgoal 1.2.20.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35 N : not_mem Hold [Copy] N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx)) ============================ Hold::N35 = []
< N: case N1. Subgoal 1.2.20.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35 N : not_mem Hold [Copy] N1 : not_mem Hold [Hold, SaveE, SaveI] N2 : not_mems Hold (Scope::Ctx) ============================ Hold::N35 = []
< N: case N1. Subgoal 1.2.20.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35 N : not_mem Hold [Copy] N2 : not_mems Hold (Scope::Ctx) N1 : Hold = Hold -> false N3 : not_mem Hold [SaveE, SaveI] ============================ Hold::N35 = []
< apply N1 to _. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1 Eq : L13 = [] ============================ mem X (L::N1)
< case Eq. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1 ============================ mem X (L::N1)
< clear SN_P32. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 ============================ mem X (L::N1)
< Or: apply mem_append to M SN_P2. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 Or : mem X N2 \/ mem X N3 ============================ mem X (L::N1)
< M': case Or. Subgoal 1.2.21: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N2 ============================ mem X (L::N1)
< MI: apply exprNames_increaseCtxs to _ _ _ _ SN1 SN_PI M'. Subgoal 1.2.21: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N2 MI : mem X NI ============================ mem X (L::N1)
< apply mem_append_left to MI SN3. Subgoal 1.2.21: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N2 MI : mem X NI H6 : mem X N1 ============================ mem X (L::N1)
< search. Subgoal 1.2.22: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 ============================ mem X (L::N1)
< Or: apply mem_append to M' SN_P3. Subgoal 1.2.22: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 Or : mem X N4 \/ mem X [L, L, L, L, L, L, L, L] ============================ mem X (L::N1)
< M'': case Or. Subgoal 1.2.22.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X N4 ============================ mem X (L::N1)
< apply fresh_name_is to _ Pr1. Subgoal 1.2.22.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X N4 H6 : is_string SaveI ============================ mem X (L::N1)
< ME: apply exprNames_increaseCtxs to _ _ _ _ SN2 SN_PE M''. Subgoal 1.2.22.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X N4 H6 : is_string SaveI ME : mem X NE ============================ mem X (L::N1)
< apply mem_append_right to ME SN3. Subgoal 1.2.22.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X N4 H6 : is_string SaveI ME : mem X NE H7 : mem X N1 ============================ mem X (L::N1)
< search. Subgoal 1.2.22.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X [L, L, L, L, L, L, L, L] ============================ mem X (L::N1)
< Eq: assert X = L. Subgoal 1.2.22.2.1: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X [L, L, L, L, L, L, L, L] ============================ X = L
< X: case M''. Subgoal 1.2.22.2.1.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L, L, L, L, L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L, L, L, L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L, L, L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L, L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.2.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L, L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.2.2.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2.2.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [L] ============================ X = L
< X: case X. Subgoal 1.2.22.2.1.2.2.2.2.2.2.2.1: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 ============================ L = L
< search. Subgoal 1.2.22.2.1.2.2.2.2.2.2.2.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 X : mem X [] ============================ X = L
< case X. Subgoal 1.2.22.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem X N3 M'' : mem X [L, L, L, L, L, L, L, L] Eq : X = L ============================ mem X (L::N1)
< case Eq. Subgoal 1.2.22.2: Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem L N_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 H4 : is_string SaveI H5 : is_string Hold NotI : L = SaveI -> false NotHold : L = Hold -> false NotE : L = SaveE -> false NotCopy : L = Copy -> false SN_P2 : N2 ++ N3 = N_P SN_PI : exprNames ([]::(Scope::Ctx)) I N2 SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3 SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4 M' : mem L N3 M'' : mem L [L, L, L, L, L, L, L, L] ============================ mem L (L::N1)
< search. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL ============================ mem X N
< case IsS. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body ============================ mem X N
< apply fresh_name_is to _ Pr1. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL ============================ mem X N
< SN: case SN. Subgoal 2: Variables: Names Scope Ctx N N_P Ctx'_P X Body SaveL X1 L NL NB Ctx2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N ============================ mem X N
< SN_P: case SN_P. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx1 ============================ mem X N
< SN_P: case SN_P. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1 N2 Ctx3 N3 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveL L) N2 Ctx3 SN_P1 : stmtNames Ctx3 (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) N3 Ctx1 SN_P2 : N2 ++ N3 = N_P ============================ mem X N
< SN_P: case SN_P. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1 N2 N3 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P1 : stmtNames ([SaveL]::(Scope::Ctx)) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) N3 Ctx1 SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 ============================ mem X N
< SN_P: case SN_P1. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (not (null (name SaveL))) CN SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB SN_P4 : CN ++ BN = N3 ============================ mem X N
< SN_P: case SN_P1. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (null (name SaveL)) CN ============================ mem X N
< SN_P: case SN_P1. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN ============================ mem X N
< SN_P: case SN_P3. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 Ctx4 N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (declare intTy X1 (head (name SaveL))) N1 Ctx4 SN_P5 : stmtNames Ctx4 (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : N1 ++ N4 = BN ============================ mem X N
< SN_P: case SN_P3. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : N1 ++ N4 = BN SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (head (name SaveL)) N1 ============================ mem X N
< SN_P: case SN_P3. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : N1 ++ N4 = BN SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1 ============================ mem X N
< Eq: assert N1 = []. Subgoal 2.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : N1 ++ N4 = BN SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1 ============================ N1 = []
< M': case SN_P3. Subgoal 2.1.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [] ++ N4 = BN M' : mems SaveL ([]::([SaveL]::(Scope::Ctx))) ============================ [] = []
< search. Subgoal 2.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [SaveL] ++ N4 = BN M' : not_mems SaveL ([]::([SaveL]::(Scope::Ctx))) ============================ [SaveL] = []
< NM: case M'. Subgoal 2.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [SaveL] ++ N4 = BN NM : not_mem SaveL [] NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx)) ============================ [SaveL] = []
< NM: case NM1. Subgoal 2.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [SaveL] ++ N4 = BN NM : not_mem SaveL [] NM1 : not_mem SaveL [SaveL] NM2 : not_mems SaveL (Scope::Ctx) ============================ [SaveL] = []
< N: case NM1. Subgoal 2.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [SaveL] ++ N4 = BN NM : not_mem SaveL [] NM2 : not_mems SaveL (Scope::Ctx) N : SaveL = SaveL -> false N1 : not_mem SaveL [] ============================ [SaveL] = []
< apply N to _. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : N1 ++ N4 = BN SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1 Eq : N1 = [] ============================ mem X N
< case Eq. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB SN_P6 : [] ++ N4 = BN SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) [] ============================ mem X N
< case SN_P6. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) [] ============================ mem X N
< clear SN_P3. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB ============================ mem X N
< Eq: assert CN = []. Subgoal 2.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB ============================ CN = []
< M': case SN_P1. Subgoal 2.2.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : [] ++ BN = N3 SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB M' : mems SaveL ([SaveL]::(Scope::Ctx)) ============================ [] = []
< search. Subgoal 2.2.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : [SaveL] ++ BN = N3 SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB M' : not_mems SaveL ([SaveL]::(Scope::Ctx)) ============================ [SaveL] = []
< NM: case M'. Subgoal 2.2.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : [SaveL] ++ BN = N3 SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB NM : not_mem SaveL [SaveL] NM1 : not_mems SaveL (Scope::Ctx) ============================ [SaveL] = []
< NM: case NM. Subgoal 2.2.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : [SaveL] ++ BN = N3 SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB NM1 : not_mems SaveL (Scope::Ctx) NM : SaveL = SaveL -> false NM2 : not_mem SaveL [] ============================ [SaveL] = []
< apply NM to _. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : CN ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB Eq : CN = [] ============================ mem X N
< case Eq. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P4 : [] ++ BN = N3 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) [] SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB ============================ mem X N
< case SN_P4. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) [] SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N3 CtxB ============================ mem X N
< clear SN_P1. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N3 CtxB ============================ mem X N
< SN_P: case SN_P5. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5 SN_P3 : stmtNames Ctx5 Body N6 CtxB SN_P4 : N5 ++ N6 = N3 ============================ mem X N
< Eq: assert N5 = [] /\ Ctx5 = [X1]::([SaveL]::(Scope::Ctx)). Subgoal 2.3: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5 SN_P3 : stmtNames Ctx5 Body N6 CtxB SN_P4 : N5 ++ N6 = N3 ============================ N5 = [] /\ Ctx5 = [X1]::([SaveL]::(Scope::Ctx))
< A: case SN_P1. Subgoal 2.3.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : N5 ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N5 ============================ N5 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< A: case A1. Subgoal 2.3.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : N5 ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (name SaveL) N5 ============================ N5 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< MA: case A1. Subgoal 2.3.1.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [] ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) MA : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) ============================ [] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< search. Subgoal 2.3.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [SaveL] ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) MA : not_mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) ============================ [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM: case MA. Subgoal 2.3.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [SaveL] ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) NM : not_mem SaveL [X1] NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx)) ============================ [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM: case NM1. Subgoal 2.3.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [SaveL] ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) NM : not_mem SaveL [X1] NM1 : not_mem SaveL [SaveL] NM2 : not_mems SaveL (Scope::Ctx) ============================ [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM': case NM1. Subgoal 2.3.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [SaveL] ++ N6 = N3 A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) NM : not_mem SaveL [X1] NM2 : not_mems SaveL (Scope::Ctx) NM' : SaveL = SaveL -> false NM'1 : not_mem SaveL [] ============================ [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< apply NM' to _. Subgoal 2.3.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : SaveL::N7 ++ N6 = N3 A : not_mems SaveL ([X1]::([SaveL]::(Scope::Ctx))) A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7 ============================ SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM: case A. Subgoal 2.3.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : SaveL::N7 ++ N6 = N3 A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7 NM : not_mem SaveL [X1] NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx)) ============================ SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM: case NM1. Subgoal 2.3.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : SaveL::N7 ++ N6 = N3 A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7 NM : not_mem SaveL [X1] NM1 : not_mem SaveL [SaveL] NM2 : not_mems SaveL (Scope::Ctx) ============================ SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< NM': case NM1. Subgoal 2.3.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : SaveL::N7 ++ N6 = N3 A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7 NM : not_mem SaveL [X1] NM2 : not_mems SaveL (Scope::Ctx) NM' : SaveL = SaveL -> false NM'1 : not_mem SaveL [] ============================ SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
< apply NM' to _. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5 SN_P3 : stmtNames Ctx5 Body N6 CtxB SN_P4 : N5 ++ N6 = N3 Eq : N5 = [] /\ Ctx5 = [X1]::([SaveL]::(Scope::Ctx)) ============================ mem X N
< case Eq. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB SN_P4 : [] ++ N6 = N3 ============================ mem X N
< case SN_P4. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB ============================ mem X N
< Or: apply mem_append to M SN_P2. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB Or : mem X N2 \/ mem X N3 ============================ mem X N
< M': case Or. Subgoal 2.4: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N2 ============================ mem X N
< ML: apply exprNames_increaseCtxs to _ _ _ _ SN SN_P M'. Subgoal 2.4: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N2 ML : mem X NL ============================ mem X N
< apply mem_append_left to ML SN2. Subgoal 2.4: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N2 ML : mem X NL H5 : mem X N ============================ mem X N
< search. Subgoal 2.5: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 ============================ mem X N
< MB: apply stmtNames_increaseCtxs to _ _ _ _ SN1 SN_P3 M'. Subgoal 2.5.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 ============================ forall X2, mems X2 ([X1]::(Scope::Ctx)) -> mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
< intros Ms. Subgoal 2.5.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 Ms : mems X2 ([X1]::(Scope::Ctx)) ============================ mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
< Ms: case Ms. Subgoal 2.5.1.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 Ms : mem X2 [X1] ============================ mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
< M'': case Ms. Subgoal 2.5.1.1.1: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 ============================ mems X1 ([X1]::([SaveL]::(Scope::Ctx)))
< search. Subgoal 2.5.1.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 M'' : mem X2 [] ============================ mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
< case M''. Subgoal 2.5.1.2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 Ms : mems X2 (Scope::Ctx) ============================ mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
< search. Subgoal 2.5: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 MB : mem X NB ============================ mem X N
< apply mem_append_right to MB SN2. Subgoal 2.5: Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P Pr1 : fresh_name "L" (X1::Names) SaveL H1 : is_string X1 H2 : is_expr L H3 : is_stmt Body H4 : is_string SaveL SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2 SN2 : NL ++ NB = N SN_P2 : N2 ++ N3 = N_P SN_P : exprNames ([]::(Scope::Ctx)) L N2 SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx))) SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB M' : mem X N3 MB : mem X NB H5 : mem X N ============================ mem X N
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_forward. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy ============================ mems X Ctx'_P
< apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI ============================ mems X Ctx'_P
< apply fresh_name_is to _ Pr2. Subgoal 1.1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI H2 : is_string Hold ============================ mems X Ctx'_P
< SN: case SN. Subgoal 1.2: Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI H2 : is_string Hold SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N ============================ mems X Ctx'_P
< SN_P: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI H2 : is_string Hold SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mems X (Scope::Ctx)
< search. Subgoal 1.3: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI H2 : is_string Hold SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 ============================ mems X Ctx'_P
< SN_P: case SN_P. Subgoal 1.3: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string SaveI H2 : is_string Hold SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mems X (Scope::Ctx)
< search. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mems X Ctx' Pr1 : fresh_name "L" (X1::Names) SaveL ============================ mems X Ctx'_P
< SN_P: case SN_P. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P X Body SaveL X1 L Ctx2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' M : mems X Ctx' Pr1 : fresh_name "L" (X1::Names) SaveL SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2 ============================ mems X (Scope::Ctx)
< SN: case SN. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L Ctx2 NL NB Ctx1 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "L" (X1::Names) SaveL SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2 SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx1 SN2 : NL ++ NB = N ============================ mems X (Scope::Ctx)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward. Subgoal 1: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx'_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy ============================ mems X Ctx'
< SN: case SN. Subgoal 1.1: Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx'_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N ============================ mems X (Scope::Ctx)
< SN_P: case SN_P. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy SN : mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mems X (Scope::Ctx)
< search. Subgoal 1.2: Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P M : mems X Ctx'_P Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 ============================ mems X (Scope::Ctx)
< SN_P: case SN_P. Subgoal 1.2: Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) IsS : is_stmt (listUpdate L I E) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy SN : not_mems L (Scope::Ctx) SN1 : exprNames (Scope::Ctx) I NI SN2 : exprNames (Scope::Ctx) E NE SN3 : NI ++ NE = N1 SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2 ============================ mems X (Scope::Ctx)
< search. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P M : mems X Ctx'_P Pr1 : fresh_name "L" (X1::Names) SaveL ============================ mems X Ctx'
< SN_P: case SN_P. Subgoal 2: Variables: Names Scope Ctx N Ctx' N_P X Body SaveL X1 L Ctx2 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx' M : mems X (Scope::Ctx) Pr1 : fresh_name "L" (X1::Names) SaveL SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2 ============================ mems X Ctx'
< SN: case SN. Subgoal 2: Variables: Names Scope Ctx N N_P X Body SaveL X1 L Ctx2 NL NB Ctx1 Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X1 L Body) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) Pr1 : fresh_name "L" (X1::Names) SaveL SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2 SN : exprNames (Scope::Ctx) L NL SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx1 SN2 : NL ++ NB = N ============================ mems X (Scope::Ctx)
< search. Proof completed.
< Prove exactEval:host:typeOf_isTy, exactEval:host:stmtOK_isCtx. Subgoal 1.23: Variables: FT ET Ty1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (nil Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (nil Ty1) (listTy Ty1) @ ============================ is_typ (listTy Ty1)
< case IsE. Subgoal 1.23: Variables: FT ET Ty1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (nil Ty1) (listTy Ty1) @ H1 : is_typ Ty1 ============================ is_typ (listTy Ty1)
< search. Subgoal 1.24: Variables: FT ET Ty1 E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (cons E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @ Ty1 : typeOf FT ET E1 Ty1 * Ty2 : typeOf FT ET E2 (listTy Ty1) * ============================ is_typ (listTy Ty1)
< case IsE. Subgoal 1.24: Variables: FT ET Ty1 E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @ Ty1 : typeOf FT ET E1 Ty1 * Ty2 : typeOf FT ET E2 (listTy Ty1) * H1 : is_expr E1 H2 : is_expr E2 ============================ is_typ (listTy Ty1)
< apply IH to _ _ _ Ty1. Subgoal 1.24: Variables: FT ET Ty1 E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @ Ty1 : typeOf FT ET E1 Ty1 * Ty2 : typeOf FT ET E2 (listTy Ty1) * H1 : is_expr E1 H2 : is_expr E2 H3 : is_typ Ty1 ============================ is_typ (listTy Ty1)
< search. Subgoal 1.25: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (head E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * ============================ is_typ Ty
< case IsE. Subgoal 1.25: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * H1 : is_expr E1 ============================ is_typ Ty
< Is: apply IH to _ _ _ Ty1. Subgoal 1.25: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * H1 : is_expr E1 Is : is_typ (listTy Ty) ============================ is_typ Ty
< case Is. Subgoal 1.25: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * H1 : is_expr E1 H2 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 1.26: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (tail E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (tail E1) (listTy Ty1) @ Ty1 : typeOf FT ET E1 (listTy Ty1) * ============================ is_typ (listTy Ty1)
< case IsE. Subgoal 1.26: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (tail E1) (listTy Ty1) @ Ty1 : typeOf FT ET E1 (listTy Ty1) * H1 : is_expr E1 ============================ is_typ (listTy Ty1)
< apply IH to _ _ _ Ty1. Subgoal 1.26: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (tail E1) (listTy Ty1) @ Ty1 : typeOf FT ET E1 (listTy Ty1) * H1 : is_expr E1 H2 : is_typ (listTy Ty1) ============================ is_typ (listTy Ty1)
< search. Subgoal 1.27: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (null E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (null E1) boolTy @ Ty1 : typeOf FT ET E1 (listTy Ty1) * ============================ is_typ boolTy
< search. Subgoal 1.28: Variables: FT ET Ty I L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (index L I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (index L I) Ty @ Ty1 : typeOf FT ET L (listTy Ty) * Ty2 : typeOf FT ET I intTy * ============================ is_typ Ty
< case IsE. Subgoal 1.28: Variables: FT ET Ty I L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (index L I) Ty @ Ty1 : typeOf FT ET L (listTy Ty) * Ty2 : typeOf FT ET I intTy * H1 : is_expr L H2 : is_expr I ============================ is_typ Ty
< Is: apply IH to _ _ _ Ty1. Subgoal 1.28: Variables: FT ET Ty I L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (index L I) Ty @ Ty1 : typeOf FT ET L (listTy Ty) * Ty2 : typeOf FT ET I intTy * H1 : is_expr L H2 : is_expr I Is : is_typ (listTy Ty) ============================ is_typ Ty
< case Is. Subgoal 1.28: Variables: FT ET Ty I L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (index L I) Ty @ Ty1 : typeOf FT ET L (listTy Ty) * Ty2 : typeOf FT ET I intTy * H1 : is_expr L H2 : is_expr I H3 : is_typ Ty ============================ is_typ Ty
< search. Subgoal 1.29: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (exactEval:list:length E1) intTy @ Ty1 : typeOf FT ET E1 (listTy Ty1) * ============================ is_typ intTy
< search. Subgoal 2.12: Variables: FT ET' Ty E I L IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (listUpdate L I E) ET' @ Ty1 : lookupScopes L ET' (listTy Ty) Ty2 : typeOf FT ET' I intTy * Ty3 : typeOf FT ET' E Ty * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Subgoal 2.13: Variables: FT ET' Ty TC1 Body L X IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (listForeach X L Body) ET' @ Ty1 : typeOf FT ET' L (listTy Ty) * Ty2 : stmtOK FT ([(X, Ty)]::ET') Body TC1 * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes. Subgoal 12: Variables: FT ET' N Ty E I L IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (listUpdate L I E) ET' @ L : length ET' N Ty1 : lookupScopes L ET' (listTy Ty) Ty2 : typeOf FT ET' I intTy * Ty3 : typeOf FT ET' E Ty * ============================ length ET' N
< search. Subgoal 13: Variables: FT ET' N Ty TC1 Body L X IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (listForeach X L Body) ET' @ L : length ET' N Ty1 : typeOf FT ET' L (listTy Ty) * Ty2 : stmtOK FT ([(X, Ty)]::ET') Body TC1 * ============================ length ET' N
< search. Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same. Subgoal 12: Variables: FT ET Scope Ty E I L IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (listUpdate L I E) (Scope::ET) @ Ty1 : lookupScopes L (Scope::ET) (listTy Ty) Ty2 : typeOf FT (Scope::ET) I intTy * Ty3 : typeOf FT (Scope::ET) E Ty * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Subgoal 13: Variables: FT ET Scope Ty TC1 Body L X IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (listForeach X L Body) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) L (listTy Ty) * Ty2 : stmtOK FT ([(X, Ty)]::(Scope::ET)) Body TC1 * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same. Subgoal 12: Variables: FT ET Scope' X Ty Ty1 E I L IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (listUpdate L I E) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : lookupScopes L (Scope'::ET) (listTy Ty1) Ty2 : typeOf FT (Scope'::ET) I intTy * Ty3 : typeOf FT (Scope'::ET) E Ty1 * ============================ lookup Scope' X Ty
< search. Subgoal 13: Variables: FT ET Scope' X Ty Ty1 TC1 Body L X1 IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (listForeach X1 L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (listForeach X1 L Body) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) L (listTy Ty1) * Ty2 : stmtOK FT ([(X1, Ty1)]::(Scope'::ET)) Body TC1 * ============================ lookup Scope' X Ty
< search. Proof completed.
< Prove exactEval:host:typeOf_unique, exactEval:host:stmtOK_unique. Subgoal 1.23: Variables: FT ET_A ET_B TyB Ty IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (nil Ty) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (nil Ty) (listTy Ty) @ TyB : typeOf FT ET_B (nil Ty) TyB Lkp : lookup_all_scopes ET_A ET_B ============================ listTy Ty = TyB
< case TyB. Subgoal 1.23: Variables: FT ET_A ET_B Ty IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (nil Ty) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (nil Ty) (listTy Ty) @ Lkp : lookup_all_scopes ET_A ET_B ============================ listTy Ty = listTy Ty
< search. Subgoal 1.24: Variables: FT ET_A ET_B TyB Ty E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (cons E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @ TyB : typeOf FT ET_B (cons E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 Ty * TyA2 : typeOf FT ET_A E2 (listTy Ty) * ============================ listTy Ty = TyB
< case IsE. Subgoal 1.24: Variables: FT ET_A ET_B TyB Ty E2 E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @ TyB : typeOf FT ET_B (cons E1 E2) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 Ty * TyA2 : typeOf FT ET_A E2 (listTy Ty) * H1 : is_expr E1 H2 : is_expr E2 ============================ listTy Ty = TyB
< TyB: case TyB. Subgoal 1.24: Variables: FT ET_A ET_B Ty E2 E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 Ty * TyA2 : typeOf FT ET_A E2 (listTy Ty) * H1 : is_expr E1 H2 : is_expr E2 TyB : typeOf FT ET_B E1 Ty1 TyB1 : typeOf FT ET_B E2 (listTy Ty1) ============================ listTy Ty = listTy Ty1
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.24: Variables: FT ET_A ET_B E2 E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty1) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 Ty1 * TyA2 : typeOf FT ET_A E2 (listTy Ty1) * H1 : is_expr E1 H2 : is_expr E2 TyB : typeOf FT ET_B E1 Ty1 TyB1 : typeOf FT ET_B E2 (listTy Ty1) ============================ listTy Ty1 = listTy Ty1
< search. Subgoal 1.25: Variables: FT ET_A ET_B TyA TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (head E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (head E1) TyA @ TyB : typeOf FT ET_B (head E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy TyA) * ============================ TyA = TyB
< case IsE. Subgoal 1.25: Variables: FT ET_A ET_B TyA TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (head E1) TyA @ TyB : typeOf FT ET_B (head E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy TyA) * H1 : is_expr E1 ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.25: Variables: FT ET_A ET_B TyA TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (head E1) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy TyA) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy TyB) ============================ TyA = TyB
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.25: Variables: FT ET_A ET_B TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (head E1) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy TyB) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy TyB) ============================ TyB = TyB
< search. Subgoal 1.26: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (tail E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (tail E1) (listTy Ty) @ TyB : typeOf FT ET_B (tail E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * ============================ listTy Ty = TyB
< case IsE. Subgoal 1.26: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (tail E1) (listTy Ty) @ TyB : typeOf FT ET_B (tail E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 ============================ listTy Ty = TyB
< TyB: case TyB. Subgoal 1.26: Variables: FT ET_A ET_B Ty E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (tail E1) (listTy Ty) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy Ty1) ============================ listTy Ty = listTy Ty1
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.26: Variables: FT ET_A ET_B E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (tail E1) (listTy Ty1) @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty1) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy Ty1) ============================ listTy Ty1 = listTy Ty1
< search. Subgoal 1.27: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (null E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (null E1) boolTy @ TyB : typeOf FT ET_B (null E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * ============================ boolTy = TyB
< case IsE. Subgoal 1.27: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (null E1) boolTy @ TyB : typeOf FT ET_B (null E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 ============================ boolTy = TyB
< TyB: case TyB. Subgoal 1.27: Variables: FT ET_A ET_B Ty E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (null E1) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy Ty1) ============================ boolTy = boolTy
< search. Subgoal 1.28: Variables: FT ET_A ET_B TyA TyB I L IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (index L I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (index L I) TyA @ TyB : typeOf FT ET_B (index L I) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A L (listTy TyA) * TyA2 : typeOf FT ET_A I intTy * ============================ TyA = TyB
< case IsE. Subgoal 1.28: Variables: FT ET_A ET_B TyA TyB I L IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (index L I) TyA @ TyB : typeOf FT ET_B (index L I) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A L (listTy TyA) * TyA2 : typeOf FT ET_A I intTy * H1 : is_expr L H2 : is_expr I ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.28: Variables: FT ET_A ET_B TyA TyB I L IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (index L I) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A L (listTy TyA) * TyA2 : typeOf FT ET_A I intTy * H1 : is_expr L H2 : is_expr I TyB : typeOf FT ET_B L (listTy TyB) TyB1 : typeOf FT ET_B I intTy ============================ TyA = TyB
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.28: Variables: FT ET_A ET_B TyB I L IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (index L I) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A L (listTy TyB) * TyA2 : typeOf FT ET_A I intTy * H1 : is_expr L H2 : is_expr I TyB : typeOf FT ET_B L (listTy TyB) TyB1 : typeOf FT ET_B I intTy ============================ TyB = TyB
< search. Subgoal 1.29: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (exactEval:list:length E1) intTy @ TyB : typeOf FT ET_B (exactEval:list:length E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * ============================ intTy = TyB
< case TyB. Subgoal 1.29: Variables: FT ET_A ET_B Ty E1 Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (exactEval:list:length E1) intTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : typeOf FT ET_B E1 (listTy Ty1) ============================ intTy = intTy
< search. Subgoal 2.12: Variables: FT ET_B ET_A' ET_B' Ty E I L IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (listUpdate L I E) ET_A' @ TyB : stmtOK FT ET_B (listUpdate L I E) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : lookupScopes L ET_A' (listTy Ty) TyA2 : typeOf FT ET_A' I intTy * TyA3 : typeOf FT ET_A' E Ty * ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.12: Variables: FT ET_A' ET_B' Ty E I L Ty1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (listUpdate L I E) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : lookupScopes L ET_A' (listTy Ty) TyA2 : typeOf FT ET_A' I intTy * TyA3 : typeOf FT ET_A' E Ty * H1 : lookupScopes L ET_B' (listTy Ty1) H2 : typeOf FT ET_B' I intTy H3 : typeOf FT ET_B' E Ty1 ============================ lookup_all_scopes ET_A' ET_B'
< search. Subgoal 2.13: Variables: FT ET_B ET_A' ET_B' Ty TC1 Body L X IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (listForeach X L Body) ET_A' @ TyB : stmtOK FT ET_B (listForeach X L Body) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' L (listTy Ty) * TyA2 : stmtOK FT ([(X, Ty)]::ET_A') Body TC1 * ============================ lookup_all_scopes ET_A' ET_B'
< TyB: case TyB. Subgoal 2.13: Variables: FT ET_A' ET_B' Ty TC1 Body L X Ty1 TC2 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (listForeach X L Body) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' L (listTy Ty) * TyA2 : stmtOK FT ([(X, Ty)]::ET_A') Body TC1 * TyB : typeOf FT ET_B' L (listTy Ty1) TyB1 : stmtOK FT ([(X, Ty1)]::ET_B') Body TC2 ============================ lookup_all_scopes ET_A' ET_B'
< search. Proof completed.
< Prove exactEval:host:paramTy_is. Proof completed.
< Prove exactEval:host:getFunInfo_is. Proof completed.
< Prove exactEval:host:paramTy_exists. Proof completed.
< Prove exactEval:host:getFunInfo_exists. Proof completed.
< Theorem listIndex_is : forall L I V, is_value L -> listIndex L I V -> is_value V. ============================ forall L I V, is_value L -> listIndex L I V -> is_value V
< induction on 2. IH : forall L I V, is_value L -> listIndex L I V * -> is_value V ============================ forall L I V, is_value L -> listIndex L I V @ -> is_value V
< intros Is LI. Variables: L I V IH : forall L I V, is_value L -> listIndex L I V * -> is_value V Is : is_value L LI : listIndex L I V @ ============================ is_value V
< LI: case LI. Subgoal 1: Variables: V Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V Is : is_value (recVal Fields) LI : lookup Fields "head" V ============================ is_value V
< case Is. Subgoal 1: Variables: V Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V LI : lookup Fields "head" V H1 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ LI. Subgoal 1: Variables: V Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V LI : lookup Fields "head" V H1 : is_list (is_pair is_string is_value) Fields H2 : is_value V ============================ is_value V
< search. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V Is : is_value (recVal Fields) LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * ============================ is_value V
< case Is. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ LI1. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl ============================ is_value V
< apply IH to _ LI2. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_value L -> listIndex L I V * -> is_value V LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl H3 : is_value V ============================ is_value V
< search. Proof completed.
< Theorem listLength_is : forall L I, is_value L -> listLength L I -> is_integer I. ============================ forall L I, is_value L -> listLength L I -> is_integer I
< induction on 2. IH : forall L I, is_value L -> listLength L I * -> is_integer I ============================ forall L I, is_value L -> listLength L I @ -> is_integer I
< intros Is LL. Variables: L I IH : forall L I, is_value L -> listLength L I * -> is_integer I Is : is_value L LL : listLength L I @ ============================ is_integer I
< LL: case LL. Subgoal 1: Variables: Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I Is : is_value (recVal Fields) LL : lookup Fields "null" trueVal ============================ is_integer 0
< search. Subgoal 2: Variables: I Tl I1 Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I Is : is_value (recVal Fields) LL : lookup Fields "null" falseVal LL1 : lookup Fields "tail" Tl LL2 : listLength Tl I1 * LL3 : I1 + 1 = I ============================ is_integer I
< case Is. Subgoal 2: Variables: I Tl I1 Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I LL : lookup Fields "null" falseVal LL1 : lookup Fields "tail" Tl LL2 : listLength Tl I1 * LL3 : I1 + 1 = I H1 : is_list (is_pair is_string is_value) Fields ============================ is_integer I
< apply lookup_is_value to _ LL1. Subgoal 2: Variables: I Tl I1 Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I LL : lookup Fields "null" falseVal LL1 : lookup Fields "tail" Tl LL2 : listLength Tl I1 * LL3 : I1 + 1 = I H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl ============================ is_integer I
< apply IH to _ LL2. Subgoal 2: Variables: I Tl I1 Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I LL : lookup Fields "null" falseVal LL1 : lookup Fields "tail" Tl LL2 : listLength Tl I1 * LL3 : I1 + 1 = I H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl H3 : is_integer I1 ============================ is_integer I
< apply plus_integer_is_integer to _ _ LL3. Subgoal 2: Variables: I Tl I1 Fields IH : forall L I, is_value L -> listLength L I * -> is_integer I LL : lookup Fields "null" falseVal LL1 : lookup Fields "tail" Tl LL2 : listLength Tl I1 * LL3 : I1 + 1 = I H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl H3 : is_integer I1 H4 : is_integer I ============================ is_integer I
< search. Proof completed.
< Theorem updateListIndex_is : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out. ============================ forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out
< induction on 3. IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out ============================ forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out @ -> is_value Out
< intros IsL IsV ULI. Variables: L I V Out IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsL : is_value L IsV : is_value V ULI : updateListIndex L I V Out @ ============================ is_value Out
< ULI: case ULI. Subgoal 1: Variables: V NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsL : is_value (recVal Fields) IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ is_value (recVal NewFields)
< case IsL. Subgoal 1: Variables: V NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields H1 : is_list (is_pair is_string is_value) Fields ============================ is_value (recVal NewFields)
< apply replaceRecVal_is to _ _ ULI1. Subgoal 1: Variables: V NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields H1 : is_list (is_pair is_string is_value) Fields H2 : is_list (is_pair is_string is_value) NewFields ============================ is_value (recVal NewFields)
< search. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsL : is_value (recVal Fields) IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ is_value (recVal NewFields)
< case IsL. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_list (is_pair is_string is_value) Fields ============================ is_value (recVal NewFields)
< apply lookup_is_value to _ ULI2. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl ============================ is_value (recVal NewFields)
< apply IH to _ _ ULI3. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl H3 : is_value TlNew ============================ is_value (recVal NewFields)
< apply replaceRecVal_is to _ _ ULI4. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsV : is_value V ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Tl H3 : is_value TlNew H4 : is_list (is_pair is_string is_value) NewFields ============================ is_value (recVal NewFields)
< search. Proof completed.
< Prove exactEval:host:evalExpr_isCtx, exactEval:host:evalExpr_isValue, exactEval:host:evalStmt_isCtx, exactEval:host:evalArgs_isCtx, exactEval:host:evalArgs_isValue, exactEval:host:evalRecFields_isCtx, exactEval:host:evalRecFields_isValue with iterateList_isCtx : forall FE EE V X Body EE' O, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IL : iterateList FE EE V X Body EE' O -> is_list (is_list (is_pair is_string is_value)) EE' on IL as IH_IL. Subgoal 1.27: Variables: FE EE' Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O Is : is_expr E1 Is1 : is_expr E2 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O Is : is_expr L Is1 : is_expr I ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O Is : is_expr L Is1 : is_expr I H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O Is : is_expr L Is1 : is_expr I H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is: case IsE. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I Is : is_expr E1 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I Is : is_expr E1 H1 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 2.27: Variables: FE EE' Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ is_value (recVal [("null", trueVal)])
< case IsE. Subgoal 2.27: Variables: FE EE' Ty IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ H1 : is_typ Ty ============================ is_value (recVal [("null", trueVal)])
< search 10. Subgoal 2.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< case IsE. Subgoal 2.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< apply IH_V_E to _ _ _ Ev1. Subgoal 2.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_value V1 ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_value V1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< apply IH_V_E to _ _ _ Ev2. Subgoal 2.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_value V1 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value V2 ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< search 20. Subgoal 2.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ is_value V
< case IsE. Subgoal 2.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ is_value V
< Is: apply IH_V_E to _ _ _ Ev1. Subgoal 2.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 Is : is_value (recVal Fields) ============================ is_value V
< case Is. Subgoal 2.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ Ev2. Subgoal 2.29: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields H3 : is_value V ============================ is_value V
< search. Subgoal 2.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ is_value V
< case IsE. Subgoal 2.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ is_value V
< Is: apply IH_V_E to _ _ _ Ev1. Subgoal 2.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 Is : is_value (recVal Fields) ============================ is_value V
< case Is. Subgoal 2.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ Ev2. Subgoal 2.30: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields H3 : is_value V ============================ is_value V
< search. Subgoal 2.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ is_value V
< case IsE. Subgoal 2.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ is_value V
< Is: apply IH_V_E to _ _ _ Ev1. Subgoal 2.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 Is : is_value (recVal Fields) ============================ is_value V
< case Is. Subgoal 2.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields ============================ is_value V
< apply lookup_is_value to _ Ev2. Subgoal 2.31: Variables: FE EE EE' V O Fields E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 H2 : is_list (is_pair is_string is_value) Fields H3 : is_value V ============================ is_value V
< search. Subgoal 2.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ is_value V
< case IsE. Subgoal 2.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ is_value V
< apply IH_V_E to _ _ _ Ev1. Subgoal 2.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_value LV ============================ is_value V
< apply listIndex_is to _ Ev3. Subgoal 2.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_value LV H4 : is_value V ============================ is_value V
< search. Subgoal 2.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ is_value (intVal I)
< case IsE. Subgoal 2.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ is_value (intVal I)
< apply IH_V_E to _ _ _ Ev1. Subgoal 2.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 H2 : is_value V1 ============================ is_value (intVal I)
< apply listLength_is to _ Ev2. Subgoal 2.33: Variables: FE EE EE' O V1 I E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 H2 : is_value V1 H3 : is_integer I ============================ is_value (intVal I)
< search. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev2. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev2. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply lookupScopes_is to _ Ev3. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : is_value V H7 : is_value LV H8 : is_string L ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply updateListIndex_is to _ _ Ev4. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : is_value V H7 : is_value LV H8 : is_string L H9 : is_value LV2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev5. Subgoal 3.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : is_value V H7 : is_value LV H8 : is_string L H9 : is_value LV2 H10 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 3.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev1. Subgoal 3.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_IL to _ _ _ _ _ Ev2. Subgoal 3.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 8.1: Variables: FE X Body EE' Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsV. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply lookup_is_value to _ IL2. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ is_list (is_list (is_pair is_string is_value)) EE'
< IsEE3+: apply IH_C_S to _ _ _ IL3. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsEE3+. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply lookup_is_value to _ IL4. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value Tl ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_IL to _ _ _ _ _ IL5. Subgoal 8.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value Tl H6 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Proof completed.
< Prove exactEval:host:evalExpr_isOutput, exactEval:host:evalStmt_isOutput, exactEval:host:evalArgs_isOutput, exactEval:host:evalRecFields_isOutput with iterateList_isOutput : forall FE EE V X Body EE' O, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IL : iterateList FE EE V X Body EE' O -> is_list is_value O on IL as IH_IL. Subgoal 1.27: Variables: FE EE' Ty IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ is_list is_value []
< search. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ is_list is_value O
< case IsE. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.29: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ is_list is_value O
< case IsE. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.30: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ is_list is_value O
< case IsE. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.31: Variables: FE EE EE' V O Fields E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev4. Subgoal 1.32: Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : is_list is_value O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O3 H6 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ is_list is_value O
< case IsE. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 H2 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev6. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_list is_value O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : is_list is_value O3 H7 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list is_value O2 ============================ is_list is_value O
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list is_value O2 H5 : is_value LV ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list is_value O2 H5 : is_value LV H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_IL to _ _ _ _ _ Ev2. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list is_value O2 H5 : is_value LV H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : is_list is_value O2 H5 : is_value LV H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : is_list is_value O3 H8 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 5.1: Variables: FE X Body EE' Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ is_list is_value []
< search. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ is_list is_value O
< case IsV. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ is_list is_value O
< apply lookup_is_value to _ IL2. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ is_list is_value O
< IsEE3+: apply evalStmt_isCtx to _ _ _ IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ is_list is_value O
< case IsEE3+. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_S to _ _ _ IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 ============================ is_list is_value O
< apply lookup_is_value to _ IL4. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_value Tl ============================ is_list is_value O
< apply IH_IL to _ _ _ _ _ IL5. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_value Tl H7 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ IL6. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list is_value O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_value Tl H7 : is_list is_value O3 H8 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Prove exactEval:host:paramName_is. Proof completed.
< Prove exactEval:host:getFunEvalInfo_is. Proof completed.
< Prove exactEval:host:evalProgram_isOutput. Proof completed.
< Prove exactEval:host:evalExpr_names_same, exactEval:host:evalStmt_names_same, exactEval:host:evalArgs_names_same, exactEval:host:evalRecFields_names_same with iterateList_names_same : forall FE EE V X Body EE' O, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IL : iterateList FE EE V X Body EE' O -> names_same EE EE' on IL as IH_IL. Subgoal 1.27: Variables: FE EE' Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ names_same EE EE'
< case IsE. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ names_same EE EE'
< case IsE. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ names_same EE EE'
< case IsE. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I NS1 : names_same EE EE3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ names_same EE EE'
< case IsE. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 H2 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_I: apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_E: apply IH_E to _ _ _ Ev2. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 H5 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_R: apply replaceScopes_names_same to _ Ev5. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 H5 : is_list (is_list (is_pair is_string is_value)) EE4 NS_R : names_same EE4 EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS': apply names_same_transitive to NS_I NS_E. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 H5 : is_list (is_list (is_pair is_string is_value)) EE4 NS_R : names_same EE4 EE' NS' : names_same (Scope::EE) EE4 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS' NS_R. Subgoal 2.15: Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 H5 : is_list (is_list (is_pair is_string is_value)) EE4 NS_R : names_same EE4 EE' NS' : names_same (Scope::EE) EE4 NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.15: Variables: FE Scope EE O N EE2 O2 V EE4 O3 LV LV2 E I L BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listUpdate L I E) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 (B::BRest) Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E NS_I : names_same (Scope::EE) EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE2 NS_E : names_same EE2 EE4 H5 : is_list (is_list (is_pair is_string is_value)) EE4 NS_R : names_same EE4 (B::BRest) NS' : names_same (Scope::EE) EE4 H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H8 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS2: apply IH_IL to _ _ _ _ _ Ev2. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV NS2 : names_same EE3 EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS1 NS2. Subgoal 2.16: Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV NS2 : names_same EE3 EE' NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.16: Variables: FE Scope EE O LV EE3 O2 O3 Body L X BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (listForeach X L Body) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body (B::BRest) O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body NS1 : names_same (Scope::EE) EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV NS2 : names_same EE3 (B::BRest) H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H8 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Subgoal 5.1: Variables: FE X Body EE' Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ names_same EE' EE'
< backchain names_same_reflexive. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsV. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ names_same EE EE'
< apply lookup_is_value to _ IL2. Subgoal 5.2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ names_same EE EE'
< NS1: apply IH_S to _ _ _ IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' ============================ names_same EE EE'
< IsEE3+: apply evalStmt_isCtx to _ _ _ IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ names_same EE EE'
< case IsEE3+. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' H3 : is_list (is_pair is_string is_value) Scope' H4 : is_list (is_list (is_pair is_string is_value)) EE'' ============================ names_same EE EE'
< apply lookup_is_value to _ IL4. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' H3 : is_list (is_pair is_string is_value) Scope' H4 : is_list (is_list (is_pair is_string is_value)) EE'' H5 : is_value Tl ============================ names_same EE EE'
< NS2: apply IH_IL to _ _ _ _ _ IL5. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' H3 : is_list (is_pair is_string is_value) Scope' H4 : is_list (is_list (is_pair is_string is_value)) EE'' H5 : is_value Tl NS2 : names_same EE'' EE' ============================ names_same EE EE'
< apply names_same_transitive to NS1 NS2. Subgoal 5.2: Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE'' IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names_same EE EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE'' Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd NS1 : names_same EE EE'' H3 : is_list (is_pair is_string is_value) Scope' H4 : is_list (is_list (is_pair is_string is_value)) EE'' H5 : is_value Tl NS2 : names_same EE'' EE' H6 : names_same EE EE' ============================ names_same EE EE'
< search. Proof completed.
< Theorem listIndex_geq_0 : forall L I V, is_integer I -> listIndex L I V -> I >= 0. ============================ forall L I V, is_integer I -> listIndex L I V -> I >= 0
< induction on 2. IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 ============================ forall L I V, is_integer I -> listIndex L I V @ -> I >= 0
< intros IsI LI. Variables: L I V IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : listIndex L I V @ ============================ I >= 0
< LI: case LI. Subgoal 1: Variables: V Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer 0 LI : lookup Fields "head" V ============================ 0 >= 0
< search. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * ============================ I >= 0
< apply minus_integer_is_integer to _ _ LI. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 ============================ I >= 0
< G: apply IH to _ LI2. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 G : I1 >= 0 ============================ I >= 0
< P: apply minus_plus_same_integer to _ _ LI. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 G : I1 >= 0 P : I1 + 1 = I ============================ I >= 0
< apply greatereq_integer__add_positive to _ _ P. Subgoal 2: Variables: I V I1 Tl Fields IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0 IsI : is_integer I LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 G : I1 >= 0 P : I1 + 1 = I H2 : I >= 0 ============================ I >= 0
< search. Proof completed.
< Theorem listIndex_unique : forall L I VA VB, listIndex L I VA -> listIndex L I VB -> VA = VB. ============================ forall L I VA VB, listIndex L I VA -> listIndex L I VB -> VA = VB
< induction on 1. IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB ============================ forall L I VA VB, listIndex L I VA @ -> listIndex L I VB -> VA = VB
< intros LIA LIB. Variables: L I VA VB IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : listIndex L I VA @ LIB : listIndex L I VB ============================ VA = VB
< LIA: case LIA. Subgoal 1: Variables: VA VB Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIB : listIndex (recVal Fields) 0 VB LIA : lookup Fields "head" VA ============================ VA = VB
< LIB: case LIB. Subgoal 1.1: Variables: VA VB Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VA LIB : lookup Fields "head" VB ============================ VA = VB
< apply lookup_unique to LIA LIB. Subgoal 1.1: Variables: VB Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VB LIB : lookup Fields "head" VB ============================ VB = VB
< search. Subgoal 1.2: Variables: VA VB Fields I1 Tl IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VA LIB : 0 - 1 = I1 LIB1 : lookup Fields "tail" Tl LIB2 : listIndex Tl I1 VB ============================ VA = VB
< compute LIB. Subgoal 1.2: Variables: VA VB Fields Tl IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VA LIB : 0 - 1 = -1 LIB1 : lookup Fields "tail" Tl LIB2 : listIndex Tl -1 VB ============================ VA = VB
< G: apply listIndex_geq_0 to _ LIB2. Subgoal 1.2: Variables: VA VB Fields Tl IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VA LIB : 0 - 1 = -1 LIB1 : lookup Fields "tail" Tl LIB2 : listIndex Tl -1 VB G : -1 >= 0 ============================ VA = VB
< G: case G. Subgoal 1.2: Variables: VA VB Fields Tl IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : lookup Fields "head" VA LIB : 0 - 1 = -1 LIB1 : lookup Fields "tail" Tl LIB2 : listIndex Tl -1 VB G : 0 <= -1 ============================ VA = VB
< case G. Subgoal 2: Variables: I VA VB I1 Tl Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIB : listIndex (recVal Fields) I VB LIA : I - 1 = I1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl I1 VA * ============================ VA = VB
< LIB: case LIB. Subgoal 2.1: Variables: VA VB I1 Tl Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : 0 - 1 = I1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl I1 VA * LIB : lookup Fields "head" VB ============================ VA = VB
< compute LIA. Subgoal 2.1: Variables: VA VB Tl Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : 0 - 1 = -1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl -1 VA * LIB : lookup Fields "head" VB ============================ VA = VB
< G: apply listIndex_geq_0 to _ LIA2. Subgoal 2.1: Variables: VA VB Tl Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : 0 - 1 = -1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl -1 VA * LIB : lookup Fields "head" VB G : -1 >= 0 ============================ VA = VB
< G: case G. Subgoal 2.1: Variables: VA VB Tl Fields IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : 0 - 1 = -1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl -1 VA * LIB : lookup Fields "head" VB G : 0 <= -1 ============================ VA = VB
< case G. Subgoal 2.2: Variables: I VA VB I1 Tl Fields I2 Tl1 IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : I - 1 = I1 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl I1 VA * LIB : I - 1 = I2 LIB1 : lookup Fields "tail" Tl1 LIB2 : listIndex Tl1 I2 VB ============================ VA = VB
< apply minus_integer_unique to LIA LIB. Subgoal 2.2: Variables: I VA VB Tl Fields I2 Tl1 IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : I - 1 = I2 LIA1 : lookup Fields "tail" Tl LIA2 : listIndex Tl I2 VA * LIB : I - 1 = I2 LIB1 : lookup Fields "tail" Tl1 LIB2 : listIndex Tl1 I2 VB ============================ VA = VB
< apply lookup_unique to LIA1 LIB1. Subgoal 2.2: Variables: I VA VB Fields I2 Tl1 IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : I - 1 = I2 LIA1 : lookup Fields "tail" Tl1 LIA2 : listIndex Tl1 I2 VA * LIB : I - 1 = I2 LIB1 : lookup Fields "tail" Tl1 LIB2 : listIndex Tl1 I2 VB ============================ VA = VB
< apply IH to LIA2 LIB2. Subgoal 2.2: Variables: I VB Fields I2 Tl1 IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB LIA : I - 1 = I2 LIA1 : lookup Fields "tail" Tl1 LIA2 : listIndex Tl1 I2 VB * LIB : I - 1 = I2 LIB1 : lookup Fields "tail" Tl1 LIB2 : listIndex Tl1 I2 VB ============================ VB = VB
< search. Proof completed.
< Theorem listLength_unique : forall L IA IB, listLength L IA -> listLength L IB -> IA = IB. ============================ forall L IA IB, listLength L IA -> listLength L IB -> IA = IB
< induction on 1. IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB ============================ forall L IA IB, listLength L IA @ -> listLength L IB -> IA = IB
< intros LLA LLB. Variables: L IA IB IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : listLength L IA @ LLB : listLength L IB ============================ IA = IB
< LLA: case LLA. Subgoal 1: Variables: IB Fields IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLB : listLength (recVal Fields) IB LLA : lookup Fields "null" trueVal ============================ 0 = IB
< LLB: case LLB. Subgoal 1.1: Variables: Fields IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" trueVal LLB : lookup Fields "null" trueVal ============================ 0 = 0
< search. Subgoal 1.2: Variables: IB Fields Tl I IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" trueVal LLB : lookup Fields "null" falseVal LLB1 : lookup Fields "tail" Tl LLB2 : listLength Tl I LLB3 : I + 1 = IB ============================ 0 = IB
< apply lookup_unique to LLA LLB. Subgoal 2: Variables: IA IB Tl I Fields IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLB : listLength (recVal Fields) IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl LLA2 : listLength Tl I * LLA3 : I + 1 = IA ============================ IA = IB
< LLB: case LLB. Subgoal 2.1: Variables: IA Tl I Fields IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl LLA2 : listLength Tl I * LLA3 : I + 1 = IA LLB : lookup Fields "null" trueVal ============================ IA = 0
< apply lookup_unique to LLA LLB. Subgoal 2.2: Variables: IA IB Tl I Fields Tl1 I1 IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl LLA2 : listLength Tl I * LLA3 : I + 1 = IA LLB : lookup Fields "null" falseVal LLB1 : lookup Fields "tail" Tl1 LLB2 : listLength Tl1 I1 LLB3 : I1 + 1 = IB ============================ IA = IB
< apply lookup_unique to LLA1 LLB1. Subgoal 2.2: Variables: IA IB I Fields Tl1 I1 IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl1 LLA2 : listLength Tl1 I * LLA3 : I + 1 = IA LLB : lookup Fields "null" falseVal LLB1 : lookup Fields "tail" Tl1 LLB2 : listLength Tl1 I1 LLB3 : I1 + 1 = IB ============================ IA = IB
< apply IH to LLA2 LLB2. Subgoal 2.2: Variables: IA IB Fields Tl1 I1 IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl1 LLA2 : listLength Tl1 I1 * LLA3 : I1 + 1 = IA LLB : lookup Fields "null" falseVal LLB1 : lookup Fields "tail" Tl1 LLB2 : listLength Tl1 I1 LLB3 : I1 + 1 = IB ============================ IA = IB
< apply plus_integer_unique to LLA3 LLB3. Subgoal 2.2: Variables: IB Fields Tl1 I1 IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB LLA : lookup Fields "null" falseVal LLA1 : lookup Fields "tail" Tl1 LLA2 : listLength Tl1 I1 * LLA3 : I1 + 1 = IB LLB : lookup Fields "null" falseVal LLB1 : lookup Fields "tail" Tl1 LLB2 : listLength Tl1 I1 LLB3 : I1 + 1 = IB ============================ IB = IB
< search. Proof completed.
< Theorem updateListIndex_geq_0 : forall L I V Out, is_integer I -> updateListIndex L I V Out -> I >= 0. ============================ forall L I V Out, is_integer I -> updateListIndex L I V Out -> I >= 0
< induction on 2. IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 ============================ forall L I V Out, is_integer I -> updateListIndex L I V Out @ -> I >= 0
< intros IsI ULI. Variables: L I V Out IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : updateListIndex L I V Out @ ============================ I >= 0
< ULI: case ULI. Subgoal 1: Variables: V NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer 0 ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ 0 >= 0
< search. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ I >= 0
< apply minus_integer_is_integer to _ _ ULI1. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_integer I1 ============================ I >= 0
< G: apply IH to _ ULI3. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_integer I1 G : I1 >= 0 ============================ I >= 0
< P: apply minus_plus_same_integer to _ _ ULI1. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_integer I1 G : I1 >= 0 P : I1 + 1 = I ============================ I >= 0
< apply greatereq_integer__add_positive to _ _ P. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields H1 : is_integer I1 G : I1 >= 0 P : I1 + 1 = I H2 : I >= 0 ============================ I >= 0
< search. Proof completed.
< Theorem updateListIndex_unique : forall L I V OutA OutB, updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB. ============================ forall L I V OutA OutB, updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB
< induction on 1. IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ============================ forall L I V OutA OutB, updateListIndex L I V OutA @ -> updateListIndex L I V OutB -> OutA = OutB
< intros ULIA ULIB. Variables: L I V OutA OutB IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : updateListIndex L I V OutA @ ULIB : updateListIndex L I V OutB ============================ OutA = OutB
< ULIA: case ULIA. Subgoal 1: Variables: V OutB NewFields Fields IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIB : updateListIndex (recVal Fields) 0 V OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ============================ recVal NewFields = OutB
< ULIB: case ULIB. Subgoal 1.1: Variables: V NewFields Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< apply replaceRecVal_unique to ULIA1 ULIB1. Subgoal 1.1: Variables: V Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields1 ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 ============================ recVal NewFields1 = recVal NewFields1
< search. Subgoal 1.2: Variables: V NewFields Fields I1 Tl TlNew NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : 0 - 1 = I1 ULIB2 : lookup Fields "tail" Tl ULIB3 : updateListIndex Tl I1 V TlNew ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< compute ULIB1. Subgoal 1.2: Variables: V NewFields Fields Tl TlNew NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : 0 - 1 = -1 ULIB2 : lookup Fields "tail" Tl ULIB3 : updateListIndex Tl -1 V TlNew ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< G: apply updateListIndex_geq_0 to _ ULIB3. Subgoal 1.2: Variables: V NewFields Fields Tl TlNew NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : 0 - 1 = -1 ULIB2 : lookup Fields "tail" Tl ULIB3 : updateListIndex Tl -1 V TlNew ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1 G : -1 >= 0 ============================ recVal NewFields = recVal NewFields1
< G: case G. Subgoal 1.2: Variables: V NewFields Fields Tl TlNew NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : replaceRecVal "head" V Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : 0 - 1 = -1 ULIB2 : lookup Fields "tail" Tl ULIB3 : updateListIndex Tl -1 V TlNew ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1 G : 0 <= -1 ============================ recVal NewFields = recVal NewFields1
< case G. Subgoal 2: Variables: I V OutB I1 Tl TlNew NewFields Fields IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIB : updateListIndex (recVal Fields) I V OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl I1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ============================ recVal NewFields = OutB
< ULIB: case ULIB. Subgoal 2.1: Variables: V I1 Tl TlNew NewFields Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : 0 - 1 = I1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl I1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< compute ULIA1. Subgoal 2.1: Variables: V Tl TlNew NewFields Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : 0 - 1 = -1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl -1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< G: apply updateListIndex_geq_0 to _ ULIA3. Subgoal 2.1: Variables: V Tl TlNew NewFields Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : 0 - 1 = -1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl -1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 G : -1 >= 0 ============================ recVal NewFields = recVal NewFields1
< G: case G. Subgoal 2.1: Variables: V Tl TlNew NewFields Fields NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : 0 - 1 = -1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl -1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : replaceRecVal "head" V Fields NewFields1 G : 0 <= -1 ============================ recVal NewFields = recVal NewFields1
< case G. Subgoal 2.2: Variables: I V I1 Tl TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I1 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl I1 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : I - 1 = I2 ULIB2 : lookup Fields "tail" Tl1 ULIB3 : updateListIndex Tl1 I2 V TlNew1 ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< apply minus_integer_unique to ULIA1 ULIB1. Subgoal 2.2: Variables: I V Tl TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I2 ULIA2 : lookup Fields "tail" Tl ULIA3 : updateListIndex Tl I2 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : I - 1 = I2 ULIB2 : lookup Fields "tail" Tl1 ULIB3 : updateListIndex Tl1 I2 V TlNew1 ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< apply lookup_unique to ULIA2 ULIB2. Subgoal 2.2: Variables: I V TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I2 ULIA2 : lookup Fields "tail" Tl1 ULIA3 : updateListIndex Tl1 I2 V TlNew * ULIA4 : replaceRecVal "tail" TlNew Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : I - 1 = I2 ULIB2 : lookup Fields "tail" Tl1 ULIB3 : updateListIndex Tl1 I2 V TlNew1 ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< apply IH to ULIA3 ULIB3. Subgoal 2.2: Variables: I V NewFields Fields I2 Tl1 TlNew1 NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I2 ULIA2 : lookup Fields "tail" Tl1 ULIA3 : updateListIndex Tl1 I2 V TlNew1 * ULIA4 : replaceRecVal "tail" TlNew1 Fields NewFields ULIB : lookup Fields "null" falseVal ULIB1 : I - 1 = I2 ULIB2 : lookup Fields "tail" Tl1 ULIB3 : updateListIndex Tl1 I2 V TlNew1 ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ============================ recVal NewFields = recVal NewFields1
< apply replaceRecVal_unique to ULIA4 ULIB4. Subgoal 2.2: Variables: I V Fields I2 Tl1 TlNew1 NewFields1 IH : forall L I V OutA OutB, updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ULIA : lookup Fields "null" falseVal ULIA1 : I - 1 = I2 ULIA2 : lookup Fields "tail" Tl1 ULIA3 : updateListIndex Tl1 I2 V TlNew1 * ULIA4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ULIB : lookup Fields "null" falseVal ULIB1 : I - 1 = I2 ULIB2 : lookup Fields "tail" Tl1 ULIB3 : updateListIndex Tl1 I2 V TlNew1 ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1 ============================ recVal NewFields1 = recVal NewFields1
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes, exactEval:host:evalExpr_newNameScopes_output, exactEval:host:evalExpr_newNameScopes_ctx, exactEval:host:evalStmt_newNameScopes_output, exactEval:host:evalStmt_newNameScopes, exactEval:host:evalArgs_newNameScopes, exactEval:host:evalArgs_newNameScopes_output, exactEval:host:evalArgs_newNameScopes_ctx, exactEval:host:evalRecFields_newNameScopes, exactEval:host:evalRecFields_newNameScopes_output, exactEval:host:evalRecFields_newNameScopes_ctx with iterateList_newNameScopes_output : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> ILA : iterateList FE EE_A V X Body EE_A' O_A -> ILB : iterateList FE EE_B V X Body EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> O_A = O_B on ILA as IH_O_IL, iterateList_newNameScopes : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> ILA : iterateList FE EE_A V X Body EE_A' O_A -> ILB : iterateList FE EE_B V X Body EE_B' O_B -> NNS : newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' on ILA as IH_C_IL. Subgoal 1.27: Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ recVal [("null", trueVal)] = VB
< case EvB. Subgoal 1.27: Variables: FE EE_A' EE_B' N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ recVal [("null", trueVal)] = recVal [("null", trueVal)]
< search. Subgoal 1.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB
< EvB: case EvB. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V3 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V3 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V4 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< search. Subgoal 1.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA ============================ VA = VB
< case IsE. Subgoal 1.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 ============================ VA = VB
< EvB: case EvB. Subgoal 1.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ VA = VB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.29: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "head" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ VB = VB
< search. Subgoal 1.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA ============================ VA = VB
< case IsE. Subgoal 1.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 ============================ VA = VB
< EvB: case EvB. Subgoal 1.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ VA = VB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.30: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "tail" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ VB = VB
< search. Subgoal 1.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA ============================ VA = VB
< case IsE. Subgoal 1.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 ============================ VA = VB
< EvB: case EvB. Subgoal 1.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ VA = VB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.31: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A * EvA2 : lookup Fields1 "null" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ VB = VB
< search. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A ============================ VA = VB
< case IsE. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I ============================ VA = VB
< EvB: case EvB. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV1 EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV1 Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV1 EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O2 * EvA3 : listIndex LV1 Idx1 VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply listIndex_unique to EvA3 EvB2. Subgoal 1.32: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV1 EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O2 * EvA3 : listIndex LV1 Idx1 VB EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB
< search. Subgoal 1.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I ============================ intVal I = VB
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 ============================ intVal I = VB
< EvB: case EvB. Subgoal 1.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ intVal I = intVal I1
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O_A * EvA2 : listLength V1 I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ intVal I = intVal I1
< apply listLength_unique to EvA2 EvB1. Subgoal 1.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I1) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O_A * EvA2 : listLength V1 I1 H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ intVal I1 = intVal I1
< search. Subgoal 2.27: Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ [] = O_B
< case EvB. Subgoal 2.27: Variables: FE EE_A' EE_B' N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ============================ [] = []
< search. Subgoal 2.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.28: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA ============================ O_A = O_B
< case IsE. Subgoal 2.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ O_B = O_B
< search. Subgoal 2.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA ============================ O_A = O_B
< case IsE. Subgoal 2.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ O_B = O_B
< search. Subgoal 2.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA ============================ O_A = O_B
< case IsE. Subgoal 2.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ O_B = O_B
< search. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O3 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 Idx I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O4 * EvA3 : listIndex LV Idx VA EvA4 : O3 ++ O4 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA4 EvB3. Subgoal 2.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len LV EE1 Idx I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O4 * EvA3 : listIndex LV Idx VA EvA4 : O3 ++ O4 = O_B H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 2.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I ============================ O_A = O_B
< case IsE. Subgoal 2.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.33: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_B * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ O_B = O_B
< search. Subgoal 3.27: Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.27: Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B H1 : is_typ Ty ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.27: Variables: FE EE_A' EE_B' N Len Ty IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' H1 : is_typ Ty ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.28: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.28: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.29: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "head" VB H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.30: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "tail" VB H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.31: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B EvB1 : lookup Fields1 "null" VB H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.32: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = O_A H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = O_B H3 : newNameScopes N Len EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.33: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.33: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O_A * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' O_B EvB1 : listLength V1 I1 H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ O_A = O_B
< L: apply newNameScopes_lookupScopes to _ _ _ EvB2 with A = EE2. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV1 ============================ O_A = O_B
< apply lookupScopes_unique to L EvA3. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 _. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 V EE2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O4 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ O_A = O_B
< apply append_unique to EvA6 EvB5. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope N1 EE1 V EE2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O4 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = O_B H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : newNameScopes N Len EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ O_B = O_B
< search. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsS. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply IH_O_IL to _ _ _ _ _ _ EvA2 EvB1 _. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope EE1 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_B = O_B
< search. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply newNameScopes_lookupScopes to _ _ _ EvB2 with A = EE2. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV1 ============================ newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_unique to L EvA3. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ newNameScopes N Len EE_A' EE_B'
< apply updateListIndex_unique to EvA4 EvB3. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA2. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV H9 : is_value V1 ============================ newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_is to _ EvA3. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV H9 : is_value V1 H10 : is_value LV H11 : is_string L ============================ newNameScopes N Len EE_A' EE_B'
< apply updateListIndex_is to _ _ EvA4. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV H9 : is_value V1 H10 : is_value LV H11 : is_string L H12 : is_value LV3 ============================ newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB4. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 RA IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV H9 : is_value V1 H10 : is_value LV H11 : is_string L H12 : is_value LV3 R : replaceScopes L LV3 EE2 RA R1 : newNameScopes N Len RA EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA5. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 * EvA2 : evalExpr FE EE1 E V1 EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N2 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O1 ++ O2 = O_A H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV EvB3 : updateListIndex LV N2 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 NNS' : newNameScopes N Len EE2 EE4 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : is_list (is_list (is_pair is_string is_value)) EE4 L : lookupScopes L EE2 LV H9 : is_value V1 H10 : is_value LV H11 : is_string L H12 : is_value LV3 R : replaceScopes L LV3 EE2 EE_A' R1 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_IL to _ _ _ _ _ _ EvA2 EvB1 _. Subgoal 5.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = O_B NNS' : newNameScopes N Len EE1 EE2 H4 : is_value LV1 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS'' : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 12.1: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ILA1 : lookup Fields "null" trueVal ============================ [] = O_B
< ILB: case ILB. Subgoal 12.1.1: Variables: FE X Body EE_A' EE_B' N Len Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" trueVal ============================ [] = []
< search. Subgoal 12.1.2: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields Hd Scope EE1 O1 Tl O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE1 Tl X Body EE_B' O2 ILB5 : O1 ++ O2 = O_B ============================ [] = O_B
< apply lookup_unique to ILA1 ILB. Subgoal 12.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsV. Subgoal 12.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ============================ O_A = O_B
< ILB: case ILB. Subgoal 12.2.1: Variables: FE EE_A X Body EE_A' EE_B' O_A N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B' ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" trueVal ============================ O_A = []
< apply lookup_unique to ILA1 ILB. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply lookup_is_value to _ ILA2. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd ============================ O_A = O_B
< apply lookup_unique to ILA2 ILB1. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 ============================ O_A = O_B
< apply IH_O_S to _ _ _ _ ILA3 ILB2 _. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 ============================ O_A = O_B
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ O_A = O_B
< case IsEE1+. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ O_A = O_B
< case IsEE2+. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ O_A = O_B
< NNS': apply IH_C_S to _ _ _ _ ILA3 ILB2 _. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) ============================ O_A = O_B
< apply lookup_unique to ILA4 ILB3. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) ============================ O_A = O_B
< apply lookup_is_value to _ ILA4. Subgoal 12.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) H7 : is_value Tl1 ============================ O_A = O_B
< NNS': case NNS'. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ O_A = O_B
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 ============================ O_A = O_B
< IsN2: apply length_is to LenB. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 ============================ O_A = O_B
< P: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 ============================ O_A = O_B
< LenEE_B+: assert length ([(X, Hd1)]::EE_B) N3. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd1)]::EE_B) N3 ============================ O_A = O_B
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB2 LenEE_B+. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd1)]::EE_B) N3 LenEE2+ : length (Scope1::EE2) N3 ============================ O_A = O_B
< apply length_unique to LenEE2+ NNS'. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len ============================ O_A = O_B
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len LEq : Len <= N2 ============================ O_A = O_B
< L: apply lt_plus_one to P _. Subgoal 12.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len LEq : Len <= N2 L : N2 < Len ============================ O_A = O_B
< apply less_lesseq_flip_false to L LEq. Subgoal 12.2.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O3 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply IH_O_IL to _ _ _ _ _ _ ILA5 ILB4 NNS'. Subgoal 12.2.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O4 * ILA6 : O3 ++ O4 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply append_unique to ILA6 ILB5. Subgoal 12.2.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_B N Len EE1 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O4 * ILA6 : O3 ++ O4 = O_B H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : newNameScopes N Len EE1 EE2 ============================ O_B = O_B
< search. Subgoal 13.1: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A' EE_B ILA1 : lookup Fields "null" trueVal ============================ newNameScopes N Len EE_A' EE_B'
< ILB: case ILB. Subgoal 13.1.1: Variables: FE X Body EE_A' EE_B' N Len Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B' ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" trueVal ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 13.1.2: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields Hd Scope EE1 O1 Tl O2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE1 Tl X Body EE_B' O2 ILB5 : O1 ++ O2 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_unique to ILA1 ILB. Subgoal 13.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsV. Subgoal 13.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ============================ newNameScopes N Len EE_A' EE_B'
< ILB: case ILB. Subgoal 13.2.1: Variables: FE EE_A X Body EE_A' EE_B' O_A N Len Hd Scope EE1 O1 Tl O2 Fields IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B' ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" trueVal ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_unique to ILA1 ILB. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_is_value to _ ILA2. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_unique to ILA2 ILB1. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 ============================ newNameScopes N Len EE_A' EE_B'
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ newNameScopes N Len EE_A' EE_B'
< case IsEE1+. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ newNameScopes N Len EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ newNameScopes N Len EE_A' EE_B'
< case IsEE2+. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': apply IH_C_S to _ _ _ _ ILA3 ILB2 _. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_unique to ILA4 ILB3. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) ============================ newNameScopes N Len EE_A' EE_B'
< apply lookup_is_value to _ ILA4. Subgoal 13.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2) H7 : is_value Tl1 ============================ newNameScopes N Len EE_A' EE_B'
< NNS': case NNS'. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ newNameScopes N Len EE_A' EE_B'
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 ============================ newNameScopes N Len EE_A' EE_B'
< IsN2: apply length_is to LenB. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 ============================ newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE_B+: assert length ([(X, Hd1)]::EE_B) N3. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd1)]::EE_B) N3 ============================ newNameScopes N Len EE_A' EE_B'
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB2 LenEE_B+. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd1)]::EE_B) N3 LenEE2+ : length (Scope1::EE2) N3 ============================ newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE2+ NNS'. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len ============================ newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len LEq : Len <= N2 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _. Subgoal 13.2.2.1: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : length (Scope1::EE2) Len NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (Scope1::EE2) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd1)]::EE_B) Len LenEE2+ : length (Scope1::EE2) Len LEq : Len <= N2 L : N2 < Len ============================ newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L LEq. Subgoal 13.2.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_IL to _ _ _ _ _ _ ILA5 ILB4 NNS'. Subgoal 13.2.2.2: Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd1 ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O1 * ILA4 : lookup Fields "tail" Tl1 ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 * ILA6 : O1 ++ O2 = O_A H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = O_B H2 : is_value Hd1 H3 : is_list (is_pair is_string is_value) Scope1 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_pair is_string is_value) Scope1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_value Tl1 NNS' : newNameScopes N Len EE1 EE2 H8 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Proof completed.
< Add_Ext_Size exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt with iterateList FE EE V X Body EE' O. Proof completed.
< Add_Proj_Rel exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt with iterateList FE EE V X Body EE' O. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_ES, exactEval:host:evalStmt_newNameScopes_exists_ES, exactEval:host:evalArgs_newNameScopes_exists_ES, exactEval:host:evalRecFields_newNameScopes_exists_ES with iterateList_newNameScopes_exists_ES : forall FE EE_A EE_B V X Body EE_B' O N Len ES, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> ILB : <iterateList {ES}> FE EE_B V X Body EE_B' O ES -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES on ILB as IH_IL. Subgoal 1.27: Variables: FE EE_A EE_B' N Len Ty IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' EvB : <evalExpr {ES}> FE EE_B' (nil Ty) (recVal [("null", trueVal)]) EE_B' [] 1 @ NNS : newNameScopes N Len EE_A EE_B' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (nil Ty) (recVal [("null", trueVal)]) EE_A' [] 1
< search. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< apply IH_E to _ _ _ _ EvB4 NNS'. Subgoal 1.28: Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2 EvB1' : evalExpr FE EE_B E1 V1 EE1 O2 EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : <evalExpr {ES}> FE EE_A' E2 V2 EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
< search. Subgoal 1.29: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "head" V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
< case IsE. Subgoal 1.29: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "head" V H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.29: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "head" V H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
< search. Subgoal 1.30: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "tail" V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
< case IsE. Subgoal 1.30: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "tail" V H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.30: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "tail" V H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
< search. Subgoal 1.31: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "null" V ============================ exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
< case IsE. Subgoal 1.31: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "null" V H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.31: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 * EvB3 : lookup Fields "null" V H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
< search. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< case IsE. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 EvA1' : evalExpr FE EE_A L LV EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 EvA1' : evalExpr FE EE_A L LV EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 EvA1' : evalExpr FE EE_A L LV EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 EvA1' : evalExpr FE EE_A L LV EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB4 NNS'. Subgoal 1.32: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 * EvB5 : listIndex LV Idx V EvB6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2 EvB1' : evalExpr FE EE_B L LV EE1 O2 EvA1' : evalExpr FE EE_A L LV EE_A' O2 NNS' : newNameScopes N Len EE_A' EE1 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : <evalExpr {ES}> FE EE_A' I (intVal Idx) EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
< search. Subgoal 1.33: Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 * EvB3 : listLength V1 I ============================ exists EE_A', <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 * EvB3 : listLength V1 I H1 : is_expr E1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.33: Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 * EvB3 : listLength V1 I H1 : is_expr E1 H2 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
< search. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA1: apply IH_E to _ _ IsA _ EvB3 _. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB4 NNS'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvB2': apply drop_ext_size_evalExpr to EvB4. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA2': apply drop_ext_size_evalExpr to EvA2. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2' EvB2' _. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< IsA': apply evalExpr_isCtx to _ _ _ EvA2'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB2'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< LA: apply newNameScopes_lookupScopes to IsA' _ _ EvB5. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isValue to _ _ _ EvB2'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV H7 : is_value V ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply lookupScopes_is to _ EvB5. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV H7 : is_value V H8 : is_value LV H9 : is_string L ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply updateListIndex_is to _ _ EvB6. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV H7 : is_value V H8 : is_value LV H9 : is_string L H10 : is_value LV2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB2'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV H7 : is_value V H8 : is_value LV H9 : is_string L H10 : is_value LV2 H11 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply newNameScopes_replaceScopes to _ _ _ _ NNS'' EvB7. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 RA IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N3 + N2 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 * EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 * EvB5 : lookupScopes L EE2 LV EvB6 : updateListIndex LV N1 V LV2 EvB7 : replaceScopes L LV2 EE2 EE_B' EvB8 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_A' NNS' : newNameScopes N Len EE_A' EE1 EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2 EvB2' : evalExpr FE EE1 E V EE2 O3 EvA2' : evalExpr FE EE_A' E V EE_A'1 O3 NNS'' : newNameScopes N Len EE_A'1 EE2 IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 LA : lookupScopes L EE_A'1 LV H7 : is_value V H8 : is_value LV H9 : is_string L H10 : is_value LV2 H11 : is_list (is_list (is_pair is_string is_value)) EE2 H12 : replaceScopes L LV2 EE_A'1 RA H13 : newNameScopes N Len RA EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< search. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< case IsS. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS'. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< EvB3': apply drop_ext_size_evalExpr to EvB3. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB3' NNS'. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 NNS'' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< apply evalExpr_isValue to _ _ _ EvA1'. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 NNS'' : newNameScopes N Len EE_A' EE1 H4 : is_value LV ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 NNS'' : newNameScopes N Len EE_A' EE1 H4 : is_value LV H5 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB3'. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 NNS'' : newNameScopes N Len EE_A' EE1 H4 : is_value LV H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< apply IH_IL to _ _ _ _ _ _ EvB4 NNS''. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N4 = ES EvB2 : N2 + N3 = N4 EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 * EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 * EvB5 : O2 ++ O3 = O NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2 EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2 EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2 NNS'' : newNameScopes N Len EE_A' EE1 H4 : is_value LV H5 : is_list (is_list (is_pair is_string is_value)) EE_A' H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : <iterateList {ES}> FE EE_A' LV X Body EE_A'1 O3 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
< search. Subgoal 5.1: Variables: FE EE_A X Body EE_B' N Len Fields IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' ILB : <iterateList {ES}> FE EE_B' (recVal Fields) X Body EE_B' [] 0 @ NNS : newNameScopes N Len EE_A EE_B' ILB1 : lookup Fields "null" trueVal ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' [] 0
< search. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< case IsV. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< apply lookup_is_value to _ ILB3. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< ILA1: apply IH_S to _ _ _ _ ILB4 NNS. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< ILB5': apply drop_ext_size_evalStmt to ILB4. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< ILA1': apply drop_ext_size_evalStmt to ILA1. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< NNS': apply evalStmt_newNameScopes to _ _ _ _ ILA1' ILB5' _. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 NNS' : newNameScopes N Len EE_A' (Scope::EE1) ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILB5'. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 NNS' : newNameScopes N Len EE_A' (Scope::EE1) IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< case IsEE1+. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 NNS' : newNameScopes N Len EE_A' (Scope::EE1) H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< IsEE_A': apply evalStmt_isCtx to _ _ _ ILA1'. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 NNS' : newNameScopes N Len EE_A' (Scope::EE1) H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< apply lookup_is_value to _ ILB5. Subgoal 5.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 NNS' : newNameScopes N Len EE_A' (Scope::EE1) H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< NNS': case NNS'. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< IsN5: apply length_is to LenB. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< P: apply plus_integer_total to _ IsN5 with N1 = 1. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = N5 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< LenEE_B+: assert length ([(X, Hd)]::EE_B) N5. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = N5 LenEE_B+ : length ([(X, Hd)]::EE_B) N5 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB5' LenEE_B+. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = N5 LenEE_B+ : length ([(X, Hd)]::EE_B) N5 LenEE2+ : length (Scope::EE1) N5 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< apply length_unique to LenEE2+ NNS'. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenEE2+ : length (Scope::EE1) Len ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenEE2+ : length (Scope::EE1) Len LEq : Len <= N4 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< L: apply lt_plus_one to P _. Subgoal 5.2.1: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_value Tl NNS' : length (Scope::EE1) Len NNS'1 : drop N1 EE_A' (Scope::EE1) NNS'2 : take N1 EE_A' N NNS'3 : names N SNames NNS'4 : names (Scope::EE1) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N4 IsN5 : is_integer N4 P : 1 + N4 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenEE2+ : length (Scope::EE1) Len LEq : Len <= N4 L : N4 < Len ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< apply less_lesseq_flip_false to L LEq. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE_A' : is_list (is_list (is_pair is_string is_value)) (Scope::AR) H5 : is_value Tl NNS' : newNameScopes N Len AR EE1 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< case IsEE_A'. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_value Tl NNS' : newNameScopes N Len AR EE1 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) AR ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< apply IH_IL to _ _ _ _ _ _ ILB6 NNS'. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR EE_A'1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B ILB1 : N2 + N3 = ES ILB2 : lookup Fields "null" falseVal ILB3 : lookup Fields "head" Hd ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 * ILB5 : lookup Fields "tail" Tl ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 * ILB7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2 ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 H3 : is_list (is_pair is_string is_value) Scope H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_value Tl NNS' : newNameScopes N Len AR EE1 H6 : is_list (is_pair is_string is_value) Scope H7 : is_list (is_list (is_pair is_string is_value)) AR H8 : <iterateList {ES}> FE AR Tl X Body EE_A'1 O3 N3 ============================ exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
< search. Proof completed.
< Prove exactEval:host:evalExpr_ctx_names, exactEval:host:evalStmt_ctx_names, exactEval:host:evalArgs_ctx_names, exactEval:host:evalRecFields_ctx_names with iterateList_ctx_names : forall FE EE V X Body EE' O Ctx N Sc Ctx', IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE Ctx -> BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> IL : iterateList FE EE V X Body EE' O -> ctx_names EE' Ctx on IL as IH_IL. Subgoal 1.27: Variables: FE EE' Ctx N Ty IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (nil Ty) N Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ ctx_names EE' Ctx
< search. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (cons E1 E2) N Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (cons E1 E2) N Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< C: apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ C EN1 Ev2. Subgoal 1.28: Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.29: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) N Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.29: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) N Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.29: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.29: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.30: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) N Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.30: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) N Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.30: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.30: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.31: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) N Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.31: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) N Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.31: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.31: Variables: FE EE V EE' O Ctx N Fields E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (index L I) N Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (index L I) N Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L N2 EN1 : exprNames Ctx I N3 EN2 : N2 ++ N3 = N ============================ ctx_names EE' Ctx
< C: apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L N2 EN1 : exprNames Ctx I N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L N2 EN1 : exprNames Ctx I N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ C EN1 Ev2. Subgoal 1.32: Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L N2 EN1 : exprNames Ctx I N3 EN2 : N2 ++ N3 = N C : ctx_names EE3 Ctx H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.33: Variables: FE EE EE' O Ctx N V1 I E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (exactEval:list:length E1) N Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.33: Variables: FE EE EE' O Ctx N V1 I E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (exactEval:list:length E1) N Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.33: Variables: FE EE EE' O Ctx N V1 I E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.33: Variables: FE EE EE' O Ctx N V1 I E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 EN : exprNames Ctx E1 N H2 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 2.15: Variables: FE EE EE' O Ctx Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) N Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.15: Variables: FE EE EE' O Ctx Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) N Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N ============================ ctx_names EE' Ctx'
< C: apply IH_E to _ _ _ _ Ctxs SN1 Ev1. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N C : ctx_names EE2 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ ctx_names EE' Ctx'
< C': apply IH_E to _ _ _ _ C SN2 Ev2. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ C' Ev5. Subgoal 2.15.1: Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 ============================ ctx_names EE' Ctx'
< C: apply IH_E to _ _ _ _ Ctxs SN1 Ev1. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 C : ctx_names EE2 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ ctx_names EE' Ctx'
< C': apply IH_E to _ _ _ _ C SN2 Ev2. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ ctx_names EE' Ctx'
< apply ctx_names_replaceScopes to _ _ C' Ev5. Subgoal 2.15.2: Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N1 V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E SN : not_mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = N2 C : ctx_names EE2 Ctx' H4 : is_list (is_list (is_pair is_string is_value)) EE2 C' : ctx_names EE4 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE4 H6 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 2.16: Variables: FE EE EE' O Ctx Ctx' N LV EE3 O2 O3 Body L X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) N Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.16: Variables: FE EE EE' O Ctx Ctx' N LV EE3 O2 O3 Body L X IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) N Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Ctx2 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB Ctx2 SN2 : NL ++ NB = N ============================ ctx_names EE' Ctx'
< M: apply stmtNames_keep_older to _ _ SN1. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx') SN2 : NL ++ NB = N M : forall X1, mem X1 [X] -> mem X1 Scope' ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ _ SN Ev1. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx') SN2 : NL ++ NB = N M : forall X1, mem X1 [X] -> mem X1 Scope' H4 : ctx_names EE3 Ctx' ============================ ctx_names EE' Ctx'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx') SN2 : NL ++ NB = N M : forall X1, mem X1 [X] -> mem X1 Scope' H4 : ctx_names EE3 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx'
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx') SN2 : NL ++ NB = N M : forall X1, mem X1 [X] -> mem X1 Scope' H4 : ctx_names EE3 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value LV ============================ ctx_names EE' Ctx'
< apply IH_IL to _ _ _ _ _ _ _ SN1 Ev2. Subgoal 2.16: Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx') SN2 : NL ++ NB = N M : forall X1, mem X1 [X] -> mem X1 Scope' H4 : ctx_names EE3 Ctx' H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value LV H7 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Subgoal 5.1: Variables: FE X Body EE' Ctx N Sc Ctx' Fields IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ ctx_names EE' Ctx
< search. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsV. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ ctx_names EE' Ctx
< apply lookup_is_value to _ IL2. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ ctx_names EE' Ctx
< apply lookup_is_value to _ IL4. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ ctx_names EE' Ctx
< apply stmtNames_keep_older to _ _ BN. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ ctx_names EE' Ctx
< assert ctx_names ([(X, Hd)]::EE) ([X]::Ctx). Subgoal 5.2.1: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
< unfold . Subgoal 5.2.1.1: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ forall K I, mem (K, I) [(X, Hd)] -> mem K [X]
< intros M. Subgoal 5.2.1.1: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K I IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' M : mem (K, I) [(X, Hd)] ============================ mem K [X]
< M: case M. Subgoal 5.2.1.1.1: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ mem X [X]
< search. Subgoal 5.2.1.1.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K I IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' M : mem (K, I) [] ============================ mem K [X]
< case M. Subgoal 5.2.1.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ forall K, mem K [X] -> exists I, mem (K, I) [(X, Hd)]
< intros M. Subgoal 5.2.1.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' M : mem K [X] ============================ exists I, mem (K, I) [(X, Hd)]
< M: case M. Subgoal 5.2.1.2.1: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ exists I, mem (X, I) [(X, Hd)]
< search. Subgoal 5.2.1.2.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' M : mem K [] ============================ exists I, mem (K, I) [(X, Hd)]
< case M. Subgoal 5.2.1.3: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ ctx_names EE Ctx
< search. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) ============================ ctx_names EE' Ctx
< Ctxs': apply IH_S to _ _ _ _ _ BN IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) Ctxs' : ctx_names (Scope::EE3) (Scope'::Ctx) ============================ ctx_names EE' Ctx
< case Ctxs'. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< IsEE3+: apply evalStmt_isCtx to _ _ _ IL3. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE3 Ctx IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ ctx_names EE' Ctx
< case IsEE3+. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE3 Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_IL to _ _ _ _ _ _ _ BN IL5. Subgoal 5.2: Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * -> ctx_names EE' Ctx IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : forall X1, mem X1 [X] -> mem X1 Scope' H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx) H6 : forall K I, mem (K, I) Scope -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope H8 : ctx_names EE3 Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE3 H11 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_back, exactEval:host:evalStmt_newNameScopes_exists_back, exactEval:host:evalArgs_newNameScopes_exists_back, exactEval:host:evalRecFields_newNameScopes_exists_back with iterateList_newNameScopes_exists_back : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> IsCtx : is_list (is_list is_string) Ctx -> Ctxs : ctx_names EE_B Ctx -> BN : stmtNames ([X]::Ctx) Body [] Ctx' -> ILA : iterateList FE EE_A V X Body EE_A' O -> NNS : newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O on ILA as IH_IL. Subgoal 1.27: Variables: FE EE_B Ctx EE_A' N Len Ty IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (nil Ty) [] EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ============================ exists EE_B', evalExpr FE EE_B (nil Ty) (recVal [("null", trueVal)]) EE_B' []
< search. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (cons E1 E2) [] EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (cons E1 E2) [] EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< EN: case EN. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N2 EN1 : exprNames Ctx E2 N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< case EN2. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< apply IH_E to _ _ _ _ _ C EN1 EvA2 NNS'. Subgoal 1.28: Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx NNS' : newNameScopes N Len EE1 EE_B' H5 : evalExpr FE EE_B' E2 V2 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< search. Subgoal 1.29: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (head E1) [] EvA : evalExpr FE EE_A (head E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< case IsE. Subgoal 1.29: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (head E1) [] EvA : evalExpr FE EE_A (head E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< EN: case EN. Subgoal 1.29: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (head E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.29: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (head E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< search. Subgoal 1.30: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (tail E1) [] EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< case IsE. Subgoal 1.30: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (tail E1) [] EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< EN: case EN. Subgoal 1.30: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.30: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< search. Subgoal 1.31: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (null E1) [] EvA : evalExpr FE EE_A (null E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< case IsE. Subgoal 1.31: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (null E1) [] EvA : evalExpr FE EE_A (null E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< EN: case EN. Subgoal 1.31: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (null E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.31: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (null E1) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< search. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (index L I) [] EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< case IsE. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (index L I) [] EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< EN: case EN. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L N2 EN1 : exprNames Ctx I N3 EN2 : N2 ++ N3 = [] ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< case EN2. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< apply IH_E to _ _ _ _ _ C EN1 EvA2 NNS'. Subgoal 1.32: Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (index L I) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EN : exprNames Ctx L [] EN1 : exprNames Ctx I [] EvB1 : evalExpr FE EE_B L LV EE_B' O2 H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx NNS' : newNameScopes N Len EE1 EE_B' H5 : evalExpr FE EE_B' I (intVal Idx) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< search. Subgoal 1.33: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (exactEval:list:length E1) [] EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (exactEval:list:length E1) [] EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< EN: case EN. Subgoal 1.33: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.33: Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I H1 : is_expr E1 EN : exprNames Ctx E1 [] H2 : evalExpr FE EE_B E1 V1 EE_B' O ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< search. Subgoal 2.15: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< EN: case SN. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L NI NE IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I NI EN2 : exprNames Ctx' E NE EN3 : NI ++ NE = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< case EN3. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ Ctxs EN1 EvA1 _. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN1 EvB1. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< EvB2: apply IH_E to _ _ _ _ _ C EN2 EvA2 NNS'. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< C': apply evalExpr_ctx_names to _ _ _ _ C EN2 EvB2. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 EvB2 _. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply newNameScopes_ctx_names_lookupScopes to NNS'' _ EN EvA3. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply evalExpr_isValue to _ _ _ EvA2. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply lookupScopes_is to _ EvA3. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_value LV H10 : is_string L ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply updateListIndex_is to _ _ EvA4. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_value LV H10 : is_string L H11 : is_value LV2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB2. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_value LV H10 : is_string L H11 : is_value LV2 H12 : is_list (is_list (is_pair is_string is_value)) EE_B'1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< apply newNameScopes_replaceScopes_back to _ _ _ _ C' EN NNS'' EvA5. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 RB IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EN : mems L Ctx' EN1 : exprNames Ctx' I [] EN2 : exprNames Ctx' E [] EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' C : ctx_names EE_B' Ctx' NNS' : newNameScopes N Len EE1 EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 C' : ctx_names EE_B'1 Ctx' NNS'' : newNameScopes N Len EE2 EE_B'1 H6 : lookupScopes L EE_B'1 LV H7 : is_value V H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_value LV H10 : is_string L H11 : is_value LV2 H12 : is_list (is_list (is_pair is_string is_value)) EE_B'1 H13 : replaceScopes L LV2 EE_B'1 RB ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
< search. Subgoal 2.16: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< case IsS. Subgoal 2.16: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< SN: case SN. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X NL NB Ctx2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB Ctx2 SN2 : NL ++ NB = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< case SN2. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ _ SN EvA1 NNS'. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_value LV ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ _ SN EvB1. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_value LV H7 : ctx_names EE_B' Ctx' ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< apply IH_IL to _ _ _ _ _ _ _ _ SN1 EvA2 NNS''. Subgoal 2.16: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2 NNS'' : newNameScopes N Len EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_value LV H7 : ctx_names EE_B' Ctx' H8 : iterateList FE EE_B' LV X Body EE_B'1 O3 ============================ exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
< search. Subgoal 5.1: Variables: FE EE_B X Body Ctx EE_A' N Len Ctx' Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ NNS : newNameScopes N Len EE_A' EE_B ILA1 : lookup Fields "null" trueVal ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' []
< search. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsV. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply lookup_is_value to _ ILA2. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply lookup_is_value to _ ILA4. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< assert ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx). Subgoal 5.2.1: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
< unfold . Subgoal 5.2.1.1: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ forall K I, mem (K, I) [(X, Hd)] -> mem K [X]
< intros M. Subgoal 5.2.1.1: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K I IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl M : mem (K, I) [(X, Hd)] ============================ mem K [X]
< M: case M. Subgoal 5.2.1.1.1: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ mem X [X]
< search. Subgoal 5.2.1.1.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K I IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl M : mem (K, I) [] ============================ mem K [X]
< case M. Subgoal 5.2.1.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ forall K, mem K [X] -> exists I, mem (K, I) [(X, Hd)]
< intros M. Subgoal 5.2.1.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl M : mem K [X] ============================ exists I, mem (K, I) [(X, Hd)]
< M: case M. Subgoal 5.2.1.2.1: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ exists I, mem (X, I) [(X, Hd)]
< search. Subgoal 5.2.1.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl M : mem K [] ============================ exists I, mem (K, I) [(X, Hd)]
< case M. Subgoal 5.2.1.3: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ ctx_names EE_B Ctx
< search. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< EvB: apply IH_S to _ _ _ _ _ _ BN ILA3 NNS. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< Ctxs': apply evalStmt_ctx_names to _ _ _ _ _ BN EvB. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 Ctxs' : ctx_names EE_B' Ctx' ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply stmtNames_keep_older to _ _ BN. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields EE_B' Scope' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 Ctxs' : ctx_names EE_B' (Scope'::Ctx) H5 : forall X1, mem X1 [X] -> mem X1 Scope' ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case Ctxs'. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsEE1+. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< IsAR+: apply evalStmt_isCtx to _ _ _ EvB. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 IsAR+ : is_list (is_list (is_pair is_string is_value)) (A::ARest) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsAR+. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< NNS': apply evalStmt_newNameScopes to _ _ _ _ ILA3 EvB _. Subgoal 5.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : newNameScopes N Len (Scope::EE1) (A::ARest) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< NNS': case NNS'. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< LenB: apply length_exists_list_pair_string_value to IsB. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< IsN2: apply length_is to LenB. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< P: apply plus_integer_total to _ IsN2 with N1 = 1. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< LenEE_B+: assert length ([(X, Hd)]::EE_B) N3. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd)]::EE_B) N3 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< LenAR+: apply evalStmt_keep_scopes to _ _ _ EvB LenEE_B+. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = N3 LenEE_B+ : length ([(X, Hd)]::EE_B) N3 LenAR+ : length (A::ARest) N3 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply length_unique to LenAR+ NNS'. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenAR+ : length (A::ARest) Len ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< LEq: apply newNameScopes_length to NNS LenB. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenAR+ : length (A::ARest) Len LEq : Len <= N2 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< L: apply lt_plus_one to P _. Subgoal 5.2.2: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) Scope H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : length (A::ARest) Len NNS'1 : drop N1 (Scope::EE1) (A::ARest) NNS'2 : take N1 (Scope::EE1) N NNS'3 : names N SNames NNS'4 : names (A::ARest) BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false LenB : length EE_B N2 IsN2 : is_integer N2 P : 1 + N2 = Len LenEE_B+ : length ([(X, Hd)]::EE_B) Len LenAR+ : length (A::ARest) Len LEq : Len <= N2 L : N2 < Len ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply less_lesseq_flip_false to L LEq. Subgoal 5.2.3: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd EE1 O2 Tl O3 Fields Scope' ARest A IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (A::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) A H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : newNameScopes N Len EE1 ARest ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply IH_IL to _ _ _ _ _ _ _ _ BN ILA5 NNS'. Subgoal 5.2.3: Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd EE1 O2 Tl O3 Fields Scope' ARest A EE_B'1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx) ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ NNS : newNameScopes N Len EE_A EE_B ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (A::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2 H5 : forall X1, mem X1 [X] -> mem X1 Scope' H6 : forall K I, mem (K, I) A -> mem K Scope' H7 : forall K, mem K Scope' -> exists I, mem (K, I) A H8 : ctx_names ARest Ctx H9 : is_list (is_pair is_string is_value) A H10 : is_list (is_list (is_pair is_string is_value)) EE1 H11 : is_list (is_pair is_string is_value) A H12 : is_list (is_list (is_pair is_string is_value)) ARest NNS' : newNameScopes N Len EE1 ARest H13 : iterateList FE ARest Tl X Body EE_B'1 O3 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same, exactEval:host:evalExpr_scopes_same_ctx, exactEval:host:evalStmt_scopes_same, exactEval:host:evalStmt_scopes_same_ctx, exactEval:host:evalArgs_scopes_same, exactEval:host:evalArgs_scopes_same_ctx, exactEval:host:evalRecFields_scopes_same, exactEval:host:evalRecFields_scopes_same_ctx with iterateList_scopes_same : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> ILA : iterateList FE EE_A V X Body EE_A' OA -> ILB : iterateList FE EE_B V X Body EE_B' OB -> OA = OB on ILA as IH_IL, iterateList_scopes_same_ctx : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> ILA : iterateList FE EE_A V X Body EE_A' OA -> ILB : iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' on ILA as IH_IL_C. Subgoal 1.27: Variables: FE EE_A' EE_B VB EE_B' OB Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' OB ============================ recVal [("null", trueVal)] = VB /\ [] = OB
< case EvB. Subgoal 1.27: Variables: FE EE_A' EE_B' Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ ============================ recVal [("null", trueVal)] = recVal [("null", trueVal)] /\ [] = []
< search. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB /\ OA = OB
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.28: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 * EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\ OB = OB
< search. Subgoal 1.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (head E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (head E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA H1 : is_expr E1 ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "head" VB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.29: Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "head" VB ============================ VA = VB /\ OB = OB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.29: Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VB EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "head" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "head" VB ============================ VB = VB /\ OB = OB
< search. Subgoal 1.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "tail" VB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.30: Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "tail" VB ============================ VA = VB /\ OB = OB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.30: Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VB EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "tail" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "tail" VB ============================ VB = VB /\ OB = OB
< search. Subgoal 1.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (null E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (null E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA H1 : is_expr E1 ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "null" VB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.31: Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "null" VB ============================ VA = VB /\ OB = OB
< apply lookup_unique to EvA2 EvB1. Subgoal 1.31: Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VB EE_A' OB @ EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB * EvA2 : lookup Fields1 "null" VB H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "null" VB ============================ VB = VB /\ OB = OB
< search. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvB : evalExpr FE EE_B (index L I) VB EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvB : evalExpr FE EE_B (index L I) VB EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV1 Idx VA EvA4 : O3 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV1 Idx VA EvA4 : O3 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV1 Idx VA EvA4 : O3 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB /\ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV1 Idx VA EvA4 : O3 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 * EvA3 : listIndex LV1 Idx1 VA EvA4 : O3 ++ O4 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ VA = VB /\ OA = OB
< apply listIndex_unique to EvA3 EvB2. Subgoal 1.32: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VB EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 * EvA3 : listIndex LV1 Idx1 VB EvA4 : O3 ++ O4 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ VB = VB /\ OA = OB
< apply append_unique to EvA4 EvB3. Subgoal 1.32: Variables: FE EE_A EE_A' EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VB EE_A' OB @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 * EvA3 : listIndex LV1 Idx1 VB EvA4 : O3 ++ O4 = OB H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : scopes_same EE1 EE2 ============================ VB = VB /\ OB = OB
< search. Subgoal 1.33: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I ============================ intVal I = VB /\ OA = OB
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I H1 : is_expr E1 ============================ intVal I = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.33: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' OB EvB1 : listLength V1 I1 ============================ intVal I = intVal I1 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.33: Variables: FE EE_A EE_A' EE_B EE_B' OB I E1 V1 I1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V1 EE_A' OB * EvA2 : listLength V1 I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' OB EvB1 : listLength V1 I1 ============================ intVal I = intVal I1 /\ OB = OB
< apply listLength_unique to EvA2 EvB1. Subgoal 1.33: Variables: FE EE_A EE_A' EE_B EE_B' OB E1 V1 I1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I1) EE_A' OB @ EvA1 : evalExpr FE EE_A E1 V1 EE_A' OB * EvA2 : listLength V1 I1 H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' OB EvB1 : listLength V1 I1 ============================ intVal I1 = intVal I1 /\ OB = OB
< search. Subgoal 2.27: Variables: FE EE_A' EE_B VB EE_B' OB Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ EvB : evalExpr FE EE_B (nil Ty) VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< case EvB. Subgoal 2.27: Variables: FE EE_A' EE_B' Ty IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.28: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr E1 H2 : is_expr E2 EvB : evalExpr FE EE_B E1 V3 EE2 O3 EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4 EvB2 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (head E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (head E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "head" VB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.29: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "head" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "head" VB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "tail" VB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.30: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "tail" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "tail" VB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (null E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvB : evalExpr FE EE_B (null E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "null" VB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.31: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA * EvA2 : lookup Fields "null" VA H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB EvB1 : lookup Fields1 "null" VB H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvB : evalExpr FE EE_B (index L I) VB EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvB : evalExpr FE EE_B (index L I) VB EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.32: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 * EvA3 : listIndex LV Idx VA EvA4 : O1 ++ O2 = OA H1 : is_expr L H2 : is_expr I EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4 EvB2 : listIndex LV1 Idx1 VB EvB3 : O3 ++ O4 = OB H3 : scopes_same EE1 EE2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.33: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.33: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I H1 : is_expr E1 ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.33: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' OB EvB1 : listLength V1 I1 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.33: Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @ EvA1 : evalExpr FE EE_A E1 V EE_A' OA * EvA2 : listLength V I H1 : is_expr E1 EvB : evalExpr FE EE_B E1 V1 EE_B' OB EvB1 : listLength V1 I1 H2 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ OA = OB
< EvB: case EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 ============================ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply scopes_same_lookupScopes to _ _ _ EvA3 EvB2. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OA = OB
< apply append_unique to EvA6 EvB5. Subgoal 3.15: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OB @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OB H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : scopes_same EE1 EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ OB = OB
< search. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ OA = OB
< EvB: case EvB. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ OA = OB
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_IL to _ _ _ _ _ _ _ EvA2 EvB1. Subgoal 3.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 3.16: Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OB @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OB = OB
< search. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V EE2 O2 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_lookupScopes to _ _ _ EvA3 EvB2. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V1 LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ scopes_same EE_A' EE_B'
< apply updateListIndex_unique to EvA4 EvB3. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA5 EvB4. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @ EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 * EvA2 : evalExpr FE EE1 E V1 EE2 O4 * EvA3 : lookupScopes L EE2 LV1 EvA4 : updateListIndex LV1 N1 V1 LV3 EvA5 : replaceScopes L LV3 EE2 EE_A' EvA6 : O3 ++ O4 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E EvB : evalExpr FE EE_B I (intVal N1) EE3 O3 EvB1 : evalExpr FE EE3 E V1 EE4 O4 EvB2 : lookupScopes L EE4 LV1 EvB3 : updateListIndex LV1 N1 V1 LV3 EvB4 : replaceScopes L LV3 EE4 EE_B' EvB5 : O3 ++ O4 = OB H4 : scopes_same EE1 EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : scopes_same EE2 EE4 H8 : is_list (is_list (is_pair is_string is_value)) EE2 H9 : is_list (is_list (is_pair is_string is_value)) EE4 H10 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV EE1 O1 * EvA2 : iterateList FE EE1 LV X Body EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_IL_C to _ _ _ _ _ _ _ EvA2 EvB1. Subgoal 4.16: Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @ EvA1 : evalExpr FE EE_A L LV1 EE1 O3 * EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV1 EE2 O3 EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : scopes_same EE1 EE2 H5 : is_value LV1 H6 : is_list (is_list (is_pair is_string is_value)) EE1 H7 : is_list (is_list (is_pair is_string is_value)) EE2 H8 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 9.1: Variables: X Body FE EE_A' EE_B EE_B' OB Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" trueVal ============================ [] = OB
< ILB: case ILB. Subgoal 9.1.1: Variables: X Body FE EE_A' EE_B' Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" trueVal ============================ [] = []
< search. Subgoal 9.1.2: Variables: X Body FE EE_A' EE_B EE_B' OB Fields Hd Scope EE1 O1 Tl O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE1 Tl X Body EE_B' O2 ILB5 : O1 ++ O2 = OB ============================ [] = OB
< apply lookup_unique to ILA1 ILB. Subgoal 9.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA ============================ OA = OB
< case IsV. Subgoal 9.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ============================ OA = OB
< ILB: case ILB. Subgoal 9.2.1: Variables: X Body FE EE_A EE_A' OA EE_B' Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A EE_B' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" trueVal ============================ OA = []
< apply lookup_unique to ILA1 ILB. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ OA = OB
< apply lookup_unique to ILB1 ILA2. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 Tl1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ OA = OB
< apply lookup_unique to ILB3 ILA4. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ OA = OB
< apply lookup_is_value to _ ILB1. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd ============================ OA = OB
< apply lookup_is_value to _ ILB3. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl ============================ OA = OB
< apply IH_S to _ _ _ _ _ ILA3 ILB2. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl ============================ OA = OB
< SS': apply IH_S_C to _ _ _ _ _ ILA3 ILB2. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ OA = OB
< case SS'. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 ============================ OA = OB
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ OA = OB
< case IsEE1+. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ OA = OB
< IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ OA = OB
< case IsEE2+. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O3 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 H9 : is_list (is_pair is_string is_value) Scope1 H10 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply IH_IL to _ _ _ _ _ _ _ ILA5 ILB4. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O4 * ILA6 : O3 ++ O4 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 H9 : is_list (is_pair is_string is_value) Scope1 H10 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OA = OB
< apply append_unique to ILA6 ILB5. Subgoal 9.2.2: Variables: X Body FE EE_A EE_A' EE_B EE_B' OB Hd Scope EE1 Tl Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OB @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O4 * ILA6 : O3 ++ O4 = OB H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 H9 : is_list (is_pair is_string is_value) Scope1 H10 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ OB = OB
< search. Subgoal 10.1: Variables: X Body FE EE_A' EE_B EE_B' OB Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" trueVal ============================ scopes_same EE_A' EE_B'
< ILB: case ILB. Subgoal 10.1.1: Variables: X Body FE EE_A' EE_B' Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A' EE_B' ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" trueVal ============================ scopes_same EE_A' EE_B'
< search. Subgoal 10.1.2: Variables: X Body FE EE_A' EE_B EE_B' OB Fields Hd Scope EE1 O1 Tl O2 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILA1 : lookup Fields "null" trueVal ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE1 Tl X Body EE_B' O2 ILB5 : O1 ++ O2 = OB ============================ scopes_same EE_A' EE_B'
< apply lookup_unique to ILA1 ILB. Subgoal 10.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsV. Subgoal 10.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ============================ scopes_same EE_A' EE_B'
< ILB: case ILB. Subgoal 10.2.1: Variables: X Body FE EE_A EE_A' OA EE_B' Hd Scope EE1 O1 Tl O2 Fields IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B' SS : scopes_same EE_A EE_B' ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" trueVal ============================ scopes_same EE_A' EE_B'
< apply lookup_unique to ILA1 ILB. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd1 ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply lookup_unique to ILB1 ILA2. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 Tl1 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl1 ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply lookup_unique to ILB3 ILA4. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply lookup_is_value to _ ILB1. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd ============================ scopes_same EE_A' EE_B'
< apply lookup_is_value to _ ILB3. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl ============================ scopes_same EE_A' EE_B'
< SS': apply IH_S_C to _ _ _ _ _ ILA3 ILB2. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl SS' : scopes_same (Scope::EE1) (Scope1::EE2) ============================ scopes_same EE_A' EE_B'
< case SS'. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ scopes_same EE_A' EE_B'
< case IsEE1+. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ scopes_same EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ scopes_same EE_A' EE_B'
< case IsEE2+. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 H9 : is_list (is_pair is_string is_value) Scope1 H10 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ scopes_same EE_A' EE_B'
< apply IH_IL_C to _ _ _ _ _ _ _ ILA5 ILB4. Subgoal 10.2.2: Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> OA = OB IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB -> scopes_same EE_A' EE_B' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 * ILA6 : O1 ++ O2 = OA H1 : is_list (is_pair is_string is_value) Fields ILB : lookup Fields "null" falseVal ILB1 : lookup Fields "head" Hd ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3 ILB3 : lookup Fields "tail" Tl ILB4 : iterateList FE EE2 Tl X Body EE_B' O4 ILB5 : O3 ++ O4 = OB H2 : is_value Hd H3 : is_value Tl H4 : forall X V, lookup Scope X V -> lookup Scope1 X V H5 : forall X V, lookup Scope1 X V -> lookup Scope X V H6 : scopes_same EE1 EE2 H7 : is_list (is_pair is_string is_value) Scope H8 : is_list (is_list (is_pair is_string is_value)) EE1 H9 : is_list (is_pair is_string is_value) Scope1 H10 : is_list (is_list (is_pair is_string is_value)) EE2 H11 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same_exists, exactEval:host:evalStmt_scopes_same_exists, exactEval:host:evalArgs_scopes_same_exists, exactEval:host:evalRecFields_scopes_same_exists with iterateList_scopes_same_exists : forall V X Body FE EE_A EE_A' O EE_B, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsA : is_list (is_list (is_pair is_string is_value)) EE_A -> IsB : is_list (is_list (is_pair is_string is_value)) EE_B -> SS : scopes_same EE_A EE_B -> ILA : iterateList FE EE_A V X Body EE_A' O -> exists EE_B', iterateList FE EE_B V X Body EE_B' O on ILA as IH_IL. Subgoal 1.27: Variables: FE EE_A' EE_B Ty IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @ ============================ exists EE_B', evalExpr FE EE_B (nil Ty) (recVal [("null", trueVal)]) EE_B' []
< search. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.28: Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 * EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E2 V2 EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
< search. Subgoal 1.29: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< case IsE. Subgoal 1.29: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.29: Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (head E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "head" V H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
< search. Subgoal 1.30: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< case IsE. Subgoal 1.30: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.30: Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (tail E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "tail" V H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
< search. Subgoal 1.31: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< case IsE. Subgoal 1.31: Variables: FE EE_A V EE_A' O EE_B Fields E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.31: Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (null E1) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O * EvA2 : lookup Fields "null" V H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O ============================ exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
< search. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< case IsE. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvB1 : evalExpr FE EE_B L LV EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvB1 : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvB1 : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvB1 : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.32: Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (index L I) V EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 * EvA3 : listIndex LV Idx V EvA4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I EvB1 : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H3 : is_list (is_list (is_pair is_string is_value)) EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' I (intVal Idx) EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
< search. Subgoal 1.33: Variables: FE EE_A EE_A' O EE_B V1 I E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_A' O EE_B V1 I E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I H1 : is_expr E1 ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.33: Variables: FE EE_A EE_A' O EE_B V1 I E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @ EvA1 : evalExpr FE EE_A E1 V1 EE_A' O * EvA2 : listLength V1 I H1 : is_expr E1 EvB1 : evalExpr FE EE_B E1 V1 EE_B' O ============================ exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
< search. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS' EvA2. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA2. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB2. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< SS'': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1 SS'' : scopes_same EE2 EE_B'1 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply scopes_same_lookupScopes_exists to _ _ SS'' EvA3. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1 SS'' : scopes_same EE2 EE_B'1 H8 : lookupScopes L EE_B'1 LV ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply scopes_same_replaceScopes_exists to _ _ _ SS'' EvA5. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @ EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 * EvA2 : evalExpr FE EE1 E V EE2 O3 * EvA3 : lookupScopes L EE2 LV EvA4 : updateListIndex LV N V LV2 EvA5 : replaceScopes L LV2 EE2 EE_A' EvA6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' EvB2 : evalExpr FE EE_B' E V EE_B'1 O3 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1 SS'' : scopes_same EE2 EE_B'1 H8 : lookupScopes L EE_B'1 LV H9 : replaceScopes L LV2 EE_B'1 B' ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< search. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< case IsS. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< EvB: apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_value LV ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< apply IH_IL to _ _ _ _ _ _ SS' EvA2. Subgoal 2.16: Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @ EvA1 : evalExpr FE EE_A L LV EE1 O2 * EvA2 : iterateList FE EE1 LV X Body EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body EvB : evalExpr FE EE_B L LV EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : is_value LV H7 : iterateList FE EE_B' LV X Body EE_B'1 O3 ============================ exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
< search. Subgoal 5.1: Variables: X Body FE EE_A' EE_B Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A' IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A' EE_B ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @ ILA1 : lookup Fields "null" trueVal ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' []
< search. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsV. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply lookup_is_value to _ ILA2. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply lookup_is_value to _ ILA4. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< SS': assert scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B). Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< EvB: apply IH_S to _ _ _ _ SS' ILA3. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1) ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsEE1+. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< IsB+: apply evalStmt_isCtx to _ _ _ EvB. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 IsB+ : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< SS+: apply evalStmt_scopes_same_ctx to _ _ _ _ _ ILA3 EvB. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 IsB+ : is_list (is_list (is_pair is_string is_value)) EE_B' SS+ : scopes_same (Scope::EE1) EE_B' ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< SS'': case SS+. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 IsB+ : is_list (is_list (is_pair is_string is_value)) (B::BRest) SS'' : forall X V, lookup Scope X V -> lookup B X V SS''1 : forall X V, lookup B X V -> lookup Scope X V SS''2 : scopes_same EE1 BRest ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< case IsB+. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 SS'' : forall X V, lookup Scope X V -> lookup B X V SS''1 : forall X V, lookup B X V -> lookup Scope X V SS''2 : scopes_same EE1 BRest H6 : is_list (is_pair is_string is_value) B H7 : is_list (is_list (is_pair is_string is_value)) BRest ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< apply IH_IL to _ _ _ _ _ _ SS''2 ILA5. Subgoal 5.2: Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B EE_B'1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IH_IL : forall V X Body FE EE_A EE_A' O EE_B, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B', iterateList FE EE_B V X Body EE_B' O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @ ILA1 : lookup Fields "null" falseVal ILA2 : lookup Fields "head" Hd ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 * ILA4 : lookup Fields "tail" Tl ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 * ILA6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B) EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE1 SS'' : forall X V, lookup Scope X V -> lookup B X V SS''1 : forall X V, lookup B X V -> lookup Scope X V SS''2 : scopes_same EE1 BRest H6 : is_list (is_pair is_string is_value) B H7 : is_list (is_list (is_pair is_string is_value)) BRest H8 : iterateList FE BRest Tl X Body EE_B'1 O3 ============================ exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
< search. Proof completed.
< Theorem is_list_values_append_nil : forall L, is_list is_value L -> L ++ [] = L. ============================ forall L, is_list is_value L -> L ++ [] = L
< induction on 1. IH : forall L, is_list is_value L * -> L ++ [] = L ============================ forall L, is_list is_value L @ -> L ++ [] = L
< intros IsL. Variables: L IH : forall L, is_list is_value L * -> L ++ [] = L IsL : is_list is_value L @ ============================ L ++ [] = L
< Is: case IsL. Subgoal 1: IH : forall L, is_list is_value L * -> L ++ [] = L ============================ [] ++ [] = []
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * ============================ H::T ++ [] = H::T
< apply IH to Is1. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * H1 : T ++ [] = T ============================ H::T ++ [] = H::T
< search. Proof completed.
< Theorem index_to_while : forall LV IV V FE Ctx I L, listIndex LV IV V -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V. ============================ forall LV IV V FE Ctx I L, listIndex LV IV V -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V
< induction on 1. IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V ============================ forall LV IV V FE Ctx I L, listIndex LV IV V @ -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V
< intros LI NEqLI IsIV. Variables: LV IV V FE Ctx I L IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V LI : listIndex LV IV V @ NEqLI : L = I -> false IsIV : is_integer IV ============================ exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V
< LI: case LI. Subgoal 1: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer 0 LI : lookup Fields "head" V ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< exists Fields. Subgoal 1: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer 0 LI : lookup Fields "head" V ============================ <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V
< split. Subgoal 1.1: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer 0 LI : lookup Fields "head" V ============================ <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0
< assert <evalExpr {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) falseVal ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0. Subgoal 1.1: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer 0 LI : lookup Fields "head" V H1 : <evalExpr {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) falseVal ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 ============================ <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0
< search. Subgoal 1.2: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer 0 LI : lookup Fields "head" V ============================ lookup Fields "head" V
< search. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< apply minus_integer_is_integer to _ _ LI. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< NEqIL: assert I = L -> false. Subgoal 2.1: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 ============================ I = L -> false
< intros E. Subgoal 2.1: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 E : I = L ============================ false
< case E. Subgoal 2.1: Variables: IV V FE Ctx L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = L -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 ============================ false
< backchain NEqLI. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< assert <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0. Subgoal 2.2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
< unfold . Subgoal 2.2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ exists N2 N1 I1 EE1 O1 I2 O2, N2 + N1 = 0 /\ (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal I1) EE1 O1 N2 /\ (<evalExpr {ES}> FE EE1 (num 0) (intVal I2) ([(I, intVal IV), (L, recVal Fields)]::Ctx) O2 N1 /\ (I1 > I2 /\ O1 ++ O2 = [])))
< exists 0, 0, IV, [(I, intVal IV), (L, recVal Fields)]::Ctx, [], 0, []. Subgoal 2.2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ 0 + 0 = 0 /\ (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal IV) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 /\ (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (num 0) (intVal 0) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 /\ (IV > 0 /\ [] ++ [] = [])))
< split. Subgoal 2.2.1: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ 0 + 0 = 0
< search. Subgoal 2.2.2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal IV) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
< search. Subgoal 2.2.3: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (num 0) (intVal 0) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
< search. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ IV > 0
< GEq: apply listIndex_geq_0 to _ LI2. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false GEq : I1 >= 0 ============================ IV > 0
< P: apply minus_plus_same_integer to _ _ LI. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false GEq : I1 >= 0 P : I1 + 1 = IV ============================ IV > 0
< P': apply plus_integer_comm to _ _ P. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false GEq : I1 >= 0 P : I1 + 1 = IV P' : 1 + I1 = IV ============================ IV > 0
< L: apply lt_plus_one to P' _. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false GEq : I1 >= 0 P : I1 + 1 = IV P' : 1 + I1 = IV L : I1 < IV ============================ IV > 0
< LEq: case GEq. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false P : I1 + 1 = IV P' : 1 + I1 = IV L : I1 < IV LEq : 0 <= I1 ============================ IV > 0
< apply lesseq_less_integer_transitive to LEq L. Subgoal 2.2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false P : I1 + 1 = IV P' : 1 + I1 = IV L : I1 < IV LEq : 0 <= I1 H2 : 0 < IV ============================ IV > 0
< search. Subgoal 2.2.5: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false ============================ [] ++ [] = []
< search. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< assert <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0. Subgoal 2.3: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 ============================ <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
< search 20. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< assert <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0. Subgoal 2.4: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0 ============================ <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0
< search 20. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0 H4 : <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< apply IH to LI2 _ _ with Ctx = Ctx FE = FE. Subgoal 2: Variables: IV V FE Ctx I L I1 Tl Fields Fields1 IH : forall LV IV V FE Ctx I L, listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields, <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "head" V NEqLI : L = I -> false IsIV : is_integer IV LI : IV - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * H1 : is_integer I1 NEqIL : I = L -> false H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0 H4 : <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0 H5 : <evalStmt {ES}> FE ([(I, intVal I1), (L, Tl)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 H6 : lookup Fields1 "head" V ============================ exists Fields1, <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "head" V
< search. Proof completed.
< Theorem while_to_index : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx). ============================ forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< induction on 1. IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) ============================ forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< intros Ev LkpL LkpHead GEqIV IsIV NEqLI. Variables: LV IV V FE Ctx Ctx' O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< NEqIL: assert I = L -> false. Subgoal 1: Variables: LV IV V FE Ctx Ctx' O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false ============================ I = L -> false
< intros E. Subgoal 1: Variables: LV IV V FE Ctx Ctx' O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false E : I = L ============================ false
< case E. Subgoal 1: Variables: LV IV V FE Ctx Ctx' O L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) Ev : evalStmt FE ([(L, intVal IV), (L, LV)]::Ctx) (while (greater (name L) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (minus (name L) (num 1))))) Ctx' O @ LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = L -> false ============================ false
< backchain NEqLI. Variables: LV IV V FE Ctx Ctx' O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1)))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev1. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 * Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev1 : evalStmt FE ([]::EE1) (assign L (recFieldAccess (name L) "tail")) EE3 O1 * Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : O1 ++ O5 = O3 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev1. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5 V1 EE4 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 * Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : O1 ++ O5 = O3 Ev1 : evalExpr FE ([]::EE1) (recFieldAccess (name L) "tail") V1 EE4 O1 * Ev7 : replaceScopes L V1 EE4 EE3 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev1. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5 V1 EE4 Fields1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 * Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : O1 ++ O5 = O3 Ev7 : replaceScopes L V1 EE4 EE3 Ev1 : evalExpr FE ([]::EE1) (name L) (recVal Fields1) EE4 O1 * Ev8 : lookup Fields1 "tail" V1 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev1. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 * Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : [] ++ O5 = O3 Ev7 : replaceScopes L V1 ([]::EE1) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::EE1) (recVal Fields1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 EE5 O6 I2 O7 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : [] ++ O5 = O3 Ev7 : replaceScopes L V1 ([]::EE1) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::EE1) (recVal Fields1) Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE5 O6 * Ev9 : evalExpr FE EE5 (num 0) (intVal I2) EE1 O7 * Ev10 : I1 > I2 Ev11 : O6 ++ O7 = O2 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev9. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 O6 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : [] ++ O5 = O3 Ev7 : replaceScopes L V1 ([]::EE1) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::EE1) (recVal Fields1) Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE1 O6 * Ev10 : I1 > 0 Ev11 : O6 ++ [] = O2 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : [] ++ O5 = O3 Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev11 : [] ++ [] = O2 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev11. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 * Ev6 : [] ++ O5 = O3 Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev6. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O3 O4 O12 EE3 V1 Fields1 I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O3 * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev3. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O12 * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev5. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 V2 EE6 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev3 : evalExpr FE EE3 (minus (name I) (num 1)) V2 EE6 O12 * Ev5 : replaceScopes I V2 EE6 (Scope::EE2) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev3. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 EE6 I4 EE7 O8 I5 O9 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev3 : evalExpr FE EE3 (name I) (intVal I4) EE7 O8 * Ev6 : evalExpr FE EE7 (num 1) (intVal I5) EE6 O9 * Ev9 : I4 - I5 = I3 Ev11 : O8 ++ O9 = O12 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev6. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 EE6 I4 O8 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev3 : evalExpr FE EE3 (name I) (intVal I4) EE6 O8 * Ev9 : I4 - 1 = I3 Ev11 : O8 ++ [] = O12 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev3. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev11 : [] ++ [] = O12 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev11. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 * Ev4 : [] ++ O4 = O Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev4. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Eq: assert I1 = IV. Subgoal 2.1: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ I1 = IV
< LS: case Ev. Subgoal 2.1.1: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : lookup [(I, intVal IV), (L, LV)] I (intVal I1) ============================ I1 = IV
< L: case LS. Subgoal 2.1.1.1: Variables: LV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : I1 >= 0 IsIV : is_integer I1 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal I1), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal I1), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ I1 = I1
< search. Subgoal 2.1.1.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) L : I = I -> false L1 : lookup [(L, LV)] I (intVal I1) ============================ I1 = IV
< apply L to _. Subgoal 2.1.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : no_lookup [(I, intVal IV), (L, LV)] I LS1 : lookupScopes I Ctx (intVal I1) ============================ I1 = IV
< NL: case LS. Subgoal 2.1.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS1 : lookupScopes I Ctx (intVal I1) NL : I = I -> false NL1 : no_lookup [(L, LV)] I ============================ I1 = IV
< apply NL to _. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : I1 > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) Eq : I1 = IV ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Eq. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : IV > 0 Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal IV) Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< clear Ev. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Eq: assert LV = recVal Fields1. Subgoal 2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ LV = recVal Fields1
< LS: case Ev1. Subgoal 2.2.1: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : lookup [] L (recVal Fields1) ============================ LV = recVal Fields1
< case LS. Subgoal 2.2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : no_lookup [] L LS1 : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields1) ============================ LV = recVal Fields1
< clear LS. Subgoal 2.2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS1 : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields1) ============================ LV = recVal Fields1
< LS: case LS1. Subgoal 2.2.2.1: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : lookup [(I, intVal IV), (L, LV)] L (recVal Fields1) ============================ LV = recVal Fields1
< L: case LS. Subgoal 2.2.2.1: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) L : I = L -> false L1 : lookup [(L, LV)] L (recVal Fields1) ============================ LV = recVal Fields1
< L': case L1. Subgoal 2.2.2.1.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) L : I = L -> false ============================ recVal Fields1 = recVal Fields1
< search. Subgoal 2.2.2.1.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) L : I = L -> false L' : L = L -> false L'1 : lookup [] L (recVal Fields1) ============================ LV = recVal Fields1
< apply L' to _. Subgoal 2.2.2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS : no_lookup [(I, intVal IV), (L, LV)] L LS1 : lookupScopes L Ctx (recVal Fields1) ============================ LV = recVal Fields1
< NL: case LS. Subgoal 2.2.2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS1 : lookupScopes L Ctx (recVal Fields1) NL : I = L -> false NL1 : no_lookup [(L, LV)] L ============================ LV = recVal Fields1
< NL': case NL1. Subgoal 2.2.2.2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) LS1 : lookupScopes L Ctx (recVal Fields1) NL : I = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ LV = recVal Fields1
< apply NL' to _. Subgoal 2: Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1) Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) Eq : LV = recVal Fields1 ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Eq. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (recVal Fields1) Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< clear Ev1. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Eq: assert EE6 = []::([(L, V1), (I, intVal IV)]::Ctx). Subgoal 2.3: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) ============================ EE6 = []::([(L, V1), (I, intVal IV)]::Ctx)
< R: case Ev7. Subgoal 2.3.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) (((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I (((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (intVal I4) R : mem (L, I6) [] R1 : remove_all [] L LRemain ============================ ((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< case R. Subgoal 2.3.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::New) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::New) (intVal I4) R : no_lookup [] L R1 : replaceScopes L V1 ([(I, intVal IV), (L, recVal Fields1)]::Ctx) New ============================ []::New = []::([(L, V1), (I, intVal IV)]::Ctx)
< clear R. Subgoal 2.3.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::New) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::New) (intVal I4) R1 : replaceScopes L V1 ([(I, intVal IV), (L, recVal Fields1)]::Ctx) New ============================ []::New = []::([(L, V1), (I, intVal IV)]::Ctx)
< R: case R1. Subgoal 2.3.2.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::LRemain)::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::(((L, V1)::LRemain)::Ctx)) (intVal I4) R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)] R1 : remove_all [(I, intVal IV), (L, recVal Fields1)] L LRemain ============================ []::(((L, V1)::LRemain)::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< RA: case R1. Subgoal 2.3.2.1.1: Variables: IV V FE Ctx Ctx' O L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = L -> false NEqIL : L = L -> false Ev2 : evalStmt FE EE2 (while (greater (name L) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (minus (name L) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes L (intVal I3) ([]::(((L, V1)::LRemain)::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes L ([]::(((L, V1)::LRemain)::Ctx)) (intVal I4) R : mem (L, I6) [(L, intVal IV), (L, recVal Fields1)] RA : remove_all [(L, recVal Fields1)] L LRemain ============================ []::(((L, V1)::LRemain)::Ctx) = []::([(L, V1), (L, intVal IV)]::Ctx)
< apply NEqLI to _. Subgoal 2.3.2.1.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (intVal I4) R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)] RA : I = L -> false RA1 : remove_all [(L, recVal Fields1)] L R ============================ []::(((L, V1)::((I, intVal IV)::R))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< RA': case RA1. Subgoal 2.3.2.1.2.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (intVal I4) R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)] RA : I = L -> false RA' : remove_all [] L R ============================ []::(((L, V1)::((I, intVal IV)::R))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< case RA'. Subgoal 2.3.2.1.2.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4) R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)] RA : I = L -> false ============================ []::([(L, V1), (I, intVal IV)]::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< search. Subgoal 2.3.2.1.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx)) (intVal I4) R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)] RA : I = L -> false RA' : L = L -> false RA'1 : remove_all [] L R1 ============================ []::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
< apply RA' to _. Subgoal 2.3.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4) R : no_lookup [(I, intVal IV), (L, recVal Fields1)] L R1 : replaceScopes L V1 Ctx New1 ============================ []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
< NL: case R. Subgoal 2.3.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4) R1 : replaceScopes L V1 Ctx New1 NL : I = L -> false NL1 : no_lookup [(L, recVal Fields1)] L ============================ []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
< NL': case NL1. Subgoal 2.3.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4) R1 : replaceScopes L V1 Ctx New1 NL : I = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
< apply NL' to _. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6 Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I EE6 (intVal I4) Eq : EE6 = []::([(L, V1), (I, intVal IV)]::Ctx) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Eq. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) ([]::([(L, V1), (I, intVal IV)]::Ctx)) Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< clear Ev7. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Eq: assert I4 = IV. Subgoal 2.4: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4) ============================ I4 = IV
< LS: case Ev3. Subgoal 2.4.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS : lookup [] I (intVal I4) ============================ I4 = IV
< case LS. Subgoal 2.4.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS : no_lookup [] I LS1 : lookupScopes I ([(L, V1), (I, intVal IV)]::Ctx) (intVal I4) ============================ I4 = IV
< clear LS. Subgoal 2.4.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS1 : lookupScopes I ([(L, V1), (I, intVal IV)]::Ctx) (intVal I4) ============================ I4 = IV
< LS: case LS1. Subgoal 2.4.2.1: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS : lookup [(L, V1), (I, intVal IV)] I (intVal I4) ============================ I4 = IV
< L: case LS. Subgoal 2.4.2.1.1: Variables: IV V FE Ctx Ctx' O I Fields Scope EE2 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes I Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : I = I -> false NEqIL : I = I -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign I (recFieldAccess (name I) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" (intVal I4) Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal I4), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 ============================ I4 = IV
< apply NEqIL to _. Subgoal 2.4.2.1.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 L : L = I -> false L1 : lookup [(I, intVal IV)] I (intVal I4) ============================ I4 = IV
< L': case L1. Subgoal 2.4.2.1.2.1: Variables: V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : I4 >= 0 IsIV : is_integer I4 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : I4 > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal I4)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 L : L = I -> false ============================ I4 = I4
< search. Subgoal 2.4.2.1.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 L : L = I -> false L' : I = I -> false L'1 : lookup [] I (intVal I4) ============================ I4 = IV
< apply L' to _. Subgoal 2.4.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS : no_lookup [(L, V1), (I, intVal IV)] I LS1 : lookupScopes I Ctx (intVal I4) ============================ I4 = IV
< NL: case LS. Subgoal 2.4.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS1 : lookupScopes I Ctx (intVal I4) NL : L = I -> false NL1 : no_lookup [(I, intVal IV)] I ============================ I4 = IV
< NL': case NL1. Subgoal 2.4.2.2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 LS1 : lookupScopes I Ctx (intVal I4) NL : L = I -> false NL' : I = I -> false NL'1 : no_lookup [] I ============================ I4 = IV
< apply NL' to _. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : I4 - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4) Eq : I4 = IV ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Eq. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : IV - 1 = I3 Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal IV) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< clear Ev3. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : IV - 1 = I3 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Eq: assert Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx). Subgoal 2.5: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : IV - 1 = I3 ============================ Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
< R: case Ev5. Subgoal 2.5.1: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [] R1 : remove_all [] I LRemain ============================ ((I, intVal I3)::LRemain)::([(L, V1), (I, intVal IV)]::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< case R. Subgoal 2.5.2: Variables: IV V FE Ctx Ctx' O I L Fields EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : no_lookup [] I R1 : replaceScopes I (intVal I3) ([(L, V1), (I, intVal IV)]::Ctx) EE2 ============================ []::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
< clear R. Subgoal 2.5.2: Variables: IV V FE Ctx Ctx' O I L Fields EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R1 : replaceScopes I (intVal I3) ([(L, V1), (I, intVal IV)]::Ctx) EE2 ============================ []::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
< R: case R1. Subgoal 2.5.2.1: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE (((I, intVal I3)::LRemain)::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(L, V1), (I, intVal IV)] R1 : remove_all [(L, V1), (I, intVal IV)] I LRemain ============================ []::(((I, intVal I3)::LRemain)::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< RA: case R1. Subgoal 2.5.2.1.1: Variables: IV V FE Ctx Ctx' O I Fields V1 Fields1 I3 I6 LRemain IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes I Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : I = I -> false NEqIL : I = I -> false Ev2 : evalStmt FE (((I, intVal I3)::LRemain)::Ctx) (while (greater (name I) (num 0)) (seq (assign I (recFieldAccess (name I) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(I, V1), (I, intVal IV)] RA : remove_all [(I, intVal IV)] I LRemain ============================ []::(((I, intVal I3)::LRemain)::Ctx) = []::([(I, intVal I3), (I, V1)]::Ctx)
< apply NEqLI to _. Subgoal 2.5.2.1.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::R))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(L, V1), (I, intVal IV)] RA : L = I -> false RA1 : remove_all [(I, intVal IV)] I R ============================ []::(((I, intVal I3)::((L, V1)::R))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< RA': case RA1. Subgoal 2.5.2.1.2.1: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::R))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(L, V1), (I, intVal IV)] RA : L = I -> false RA' : remove_all [] I R ============================ []::(((I, intVal I3)::((L, V1)::R))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< case RA'. Subgoal 2.5.2.1.2.1: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(L, V1), (I, intVal IV)] RA : L = I -> false ============================ []::([(I, intVal I3), (L, V1)]::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< search. Subgoal 2.5.2.1.2.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::((I, intVal IV)::R1)))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : mem (I, I6) [(L, V1), (I, intVal IV)] RA : L = I -> false RA' : I = I -> false RA'1 : remove_all [] I R1 ============================ []::(((I, intVal I3)::((L, V1)::((I, intVal IV)::R1)))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
< apply RA' to _. Subgoal 2.5.2.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R : no_lookup [(L, V1), (I, intVal IV)] I R1 : replaceScopes I (intVal I3) Ctx New ============================ []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
< NL: case R. Subgoal 2.5.2.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R1 : replaceScopes I (intVal I3) Ctx New NL : L = I -> false NL1 : no_lookup [(I, intVal IV)] I ============================ []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
< NL': case NL1. Subgoal 2.5.2.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 R1 : replaceScopes I (intVal I3) Ctx New NL : L = I -> false NL' : I = I -> false NL'1 : no_lookup [] I ============================ []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
< apply NL' to _. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2) Ev9 : IV - 1 = I3 Eq : Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx) ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Eq. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) ([]::([(I, intVal I3), (L, V1)]::Ctx)) Ev9 : IV - 1 = I3 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< clear Ev5. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< apply minus_integer_is_integer to _ _ Ev9. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< P: apply minus_plus_same_integer to _ _ Ev9. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< P': apply plus_integer_comm to _ _ P. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< M: apply plus_minus_same_integer to _ _ P'. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< assert I3 >= 0. Subgoal 2.6: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 ============================ I3 >= 0
< GEq1: apply greater_integer_step_greatereq to _ _ Ev10 _. Subgoal 2.6: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 ============================ I3 >= 0
< Or: apply is_integer_related to _ _ with A = IV B = 1. Subgoal 2.6: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 Or : (IV = 1 \/ IV < 1) \/ IV > 1 ============================ I3 >= 0
< C: case Or. Subgoal 2.6.1: Variables: V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 1 >= 0 IsIV : is_integer 1 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : 1 > 0 Ev9 : 1 - 1 = I3 H1 : is_integer I3 P : I3 + 1 = 1 P' : 1 + I3 = 1 M : 1 - I3 = 1 GEq1 : 1 >= 1 ============================ I3 >= 0
< compute Ev9. Subgoal 2.6.1: Variables: V FE Ctx Ctx' O I L Fields V1 Fields1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 1 >= 0 IsIV : is_integer 1 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal 0), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : 1 > 0 Ev9 : 1 - 1 = 0 H1 : is_integer 0 P : 0 + 1 = 1 P' : 1 + 0 = 1 M : 1 - 0 = 1 GEq1 : 1 >= 1 ============================ 0 >= 0
< search. Subgoal 2.6.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 C : IV < 1 ============================ I3 >= 0
< LEq1: case GEq1. Subgoal 2.6.2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 C : IV < 1 LEq1 : 1 <= IV ============================ I3 >= 0
< apply less_lesseq_flip_false to C LEq1. Subgoal 2.6.3: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 C : IV > 1 ============================ I3 >= 0
< case C. Subgoal 2.6.3: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 H2 : 1 < IV ============================ I3 >= 0
< LI3: apply minus_smaller_positive to Ev9 _. Subgoal 2.6.3: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 H2 : 1 < IV LI3 : 0 < I3 ============================ I3 >= 0
< apply less_integer_lesseq to LI3. Subgoal 2.6.3: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 GEq1 : IV >= 1 H2 : 1 < IV LI3 : 0 < I3 H3 : 0 <= I3 ============================ I3 >= 0
< search. Subgoal 2: Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 H2 : I3 >= 0 ============================ (listIndex (recVal Fields1) IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< apply IH to Ev2 LkpL LkpHead _ _ _. Subgoal 2: Variables: IV V FE Ctx I L Fields V1 Fields1 I3 Scope1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L (Scope1::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) (Scope1::Ctx) [] * Ev8 : lookup Fields1 "tail" V1 Ev10 : IV > 0 Ev9 : IV - 1 = I3 H1 : is_integer I3 P : I3 + 1 = IV P' : 1 + I3 = IV M : IV - I3 = 1 H2 : I3 >= 0 H3 : listIndex V1 I3 V ============================ (listIndex (recVal Fields1) IV V /\ [] = []) /\ (exists Scope, Scope1::Ctx = Scope::Ctx)
< search. Subgoal 3: Variables: LV IV V FE Ctx Ctx' O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) falseVal Ctx' O * ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev. Subgoal 3: Variables: LV IV V FE Ctx Ctx' O I L Fields I1 EE1 O2 I2 O3 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE1 O2 * Ev1 : evalExpr FE EE1 (num 0) (intVal I2) Ctx' O3 * Ev2 : I1 <= I2 Ev3 : O2 ++ O3 = O ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< case Ev1. Subgoal 3: Variables: LV IV V FE Ctx Ctx' O I L Fields I1 O2 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L Ctx' (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) Ctx' O2 * Ev2 : I1 <= 0 Ev3 : O2 ++ [] = O ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
< Ev: case Ev. Subgoal 3: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< Eq: assert I1 = IV. Subgoal 3.1: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) ============================ I1 = IV
< LS: case Ev. Subgoal 3.1.1: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O LS : lookup [(I, intVal IV), (L, LV)] I (intVal I1) ============================ I1 = IV
< L: case LS. Subgoal 3.1.1.1: Variables: LV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal I1), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : I1 >= 0 IsIV : is_integer I1 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O ============================ I1 = I1
< search. Subgoal 3.1.1.2: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O L : I = I -> false L1 : lookup [(L, LV)] I (intVal I1) ============================ I1 = IV
< apply L to _. Subgoal 3.1.2: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O LS : no_lookup [(I, intVal IV), (L, LV)] I LS1 : lookupScopes I Ctx (intVal I1) ============================ I1 = IV
< NL: case LS. Subgoal 3.1.2: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O LS1 : lookupScopes I Ctx (intVal I1) NL : I = I -> false NL1 : no_lookup [(L, LV)] I ============================ I1 = IV
< apply NL to _. Subgoal 3: Variables: LV IV V FE Ctx O I L Fields I1 IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : I1 <= 0 Ev3 : [] ++ [] = O Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1) Eq : I1 = IV ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< case Eq. Subgoal 3: Variables: LV IV V FE Ctx O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 Ev3 : [] ++ [] = O Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal IV) ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< clear Ev. Subgoal 3: Variables: LV IV V FE Ctx O I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 Ev3 : [] ++ [] = O ============================ (listIndex LV IV V /\ O = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< case Ev3. Subgoal 3: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 ============================ (listIndex LV IV V /\ [] = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< Eq: assert IV = 0. Subgoal 3.2: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 ============================ IV = 0
< Or: apply greatereq_integer_greater_or_eq to GEqIV. Subgoal 3.2: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 Or : IV > 0 \/ IV = 0 ============================ IV = 0
< C: case Or. Subgoal 3.2.1: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 C : IV > 0 ============================ IV = 0
< L: case C. Subgoal 3.2.1: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 L : 0 < IV ============================ IV = 0
< apply less_lesseq_flip_false to L Ev2. Subgoal 3.2.2: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 ============================ 0 = 0
< search. Subgoal 3: Variables: LV IV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : IV >= 0 IsIV : is_integer IV NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : IV <= 0 Eq : IV = 0 ============================ (listIndex LV IV V /\ [] = []) /\ (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
< case Eq. Subgoal 3: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 ============================ (listIndex LV 0 V /\ [] = []) /\ (exists Scope, [(I, intVal 0), (L, LV)]::Ctx = Scope::Ctx)
< Eq: assert LV = recVal Fields. Subgoal 3.3: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 ============================ LV = recVal Fields
< LS: case LkpL. Subgoal 3.3.1: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 LS : lookup [(I, intVal 0), (L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L: case LS. Subgoal 3.3.1: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 L : I = L -> false L1 : lookup [(L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L': case L1. Subgoal 3.3.1.1: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 L : I = L -> false ============================ recVal Fields = recVal Fields
< search. Subgoal 3.3.1.2: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 L : I = L -> false L' : L = L -> false L'1 : lookup [] L (recVal Fields) ============================ LV = recVal Fields
< apply L' to _. Subgoal 3.3.2: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 LS : no_lookup [(I, intVal 0), (L, LV)] L LS1 : lookupScopes L Ctx (recVal Fields) ============================ LV = recVal Fields
< NL: case LS. Subgoal 3.3.2: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 LS1 : lookupScopes L Ctx (recVal Fields) NL : I = L -> false NL1 : no_lookup [(L, LV)] L ============================ LV = recVal Fields
< NL': case NL1. Subgoal 3.3.2: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 LS1 : lookupScopes L Ctx (recVal Fields) NL : I = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ LV = recVal Fields
< apply NL' to _. Subgoal 3: Variables: LV V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 Eq : LV = recVal Fields ============================ (listIndex LV 0 V /\ [] = []) /\ (exists Scope, [(I, intVal 0), (L, LV)]::Ctx = Scope::Ctx)
< case Eq. Subgoal 3: Variables: V FE Ctx I L Fields IH : forall LV IV V FE Ctx Ctx' O I L Fields, evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * -> lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx) LkpL : lookupScopes L ([(I, intVal 0), (L, recVal Fields)]::Ctx) (recVal Fields) LkpHead : lookup Fields "head" V GEqIV : 0 >= 0 IsIV : is_integer 0 NEqLI : L = I -> false NEqIL : I = L -> false Ev2 : 0 <= 0 ============================ (listIndex (recVal Fields) 0 V /\ [] = []) /\ (exists Scope, [(I, intVal 0), (L, recVal Fields)]::Ctx = Scope::Ctx)
< search. Proof completed.
< Theorem length_to_while : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal. ============================ forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal
< induction on 1. IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal ============================ forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen @ -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal
< intros Len NEq P IsSLen IsCLen. Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal Len : listLength LV CurrLen @ NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen ============================ exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal
< assert Len = L -> false. Subgoal 1: Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal Len : listLength LV CurrLen @ NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen ============================ Len = L -> false
< intros E. Subgoal 1: Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal Len : listLength LV CurrLen @ NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen E : Len = L ============================ false
< case E. Subgoal 1: Variables: LV StoreLen L CurrLen TotalLen FE Ctx IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal Len : listLength LV CurrLen @ NEq : L = L -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen ============================ false
< backchain NEq. Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal Len : listLength LV CurrLen @ NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false ============================ exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal
< Len: case Len. Subgoal 2: Variables: StoreLen L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : 0 + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< case P. Subgoal 2: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< exists Fields. Subgoal 2: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal ============================ <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal
< split. Subgoal 2.1: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal ============================ <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
< assert lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields). Subgoal 2.1: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal H2 : lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields) ============================ <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
< assert <evalExpr {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0. Subgoal 2.1: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal H2 : lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields) H3 : <evalExpr {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 ============================ <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
< search. Subgoal 2.2: Variables: L Len TotalLen FE Ctx Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false IsSLen : is_integer TotalLen IsCLen : is_integer 0 H1 : Len = L -> false Len : lookup Fields "null" trueVal ============================ lookup Fields "null" trueVal
< search. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< LSL: assert lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields). Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< EvC: assert <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< EvL: assert <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0. Subgoal 3.1: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 ============================ <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
< search 20. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< P': apply plus_integer_total to _ IsSLen with N1 = 1. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< apply plus_integer_is_integer to _ _ P'. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< EvE: assert <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0. Subgoal 3.2: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 ============================ <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
< apply plus_integer_comm to _ _ P'. Subgoal 3.2: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 H3 : StoreLen + 1 = N3 ============================ <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
< search 20. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< IsI: apply plus_integer_is_integer_result to _ Len3. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I IsI1 : is_integer 1 ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< clear IsI1. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< assert I + N3 = TotalLen. Subgoal 3.3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I ============================ I + N3 = TotalLen
< OrigP': apply plus_integer_comm to _ _ P. Subgoal 3.3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I OrigP' : StoreLen + CurrLen = TotalLen ============================ I + N3 = TotalLen
< AssocP: apply plus_integer_assoc to _ _ _ Len3 OrigP'. Subgoal 3.3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Subtotal' IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I OrigP' : StoreLen + CurrLen = TotalLen AssocP : 1 + StoreLen = Subtotal' AssocP1 : I + Subtotal' = TotalLen ============================ I + N3 = TotalLen
< apply plus_integer_unique to P' AssocP. Subgoal 3.3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields Subtotal' IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = Subtotal' H2 : is_integer Subtotal' EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal Subtotal'), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I OrigP' : StoreLen + CurrLen = TotalLen AssocP : 1 + StoreLen = Subtotal' AssocP1 : I + Subtotal' = TotalLen ============================ I + Subtotal' = TotalLen
< search. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I H3 : I + N3 = TotalLen ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< apply IH to Len2 NEq _ _ _ with TotalLen = TotalLen StoreLen = N3 FE = FE Ctx = Ctx. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Fields1 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I H3 : I + N3 = TotalLen H4 : <evalStmt {ES}> FE ([(Len, intVal N3), (L, Tl)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 H5 : lookup Fields1 "null" trueVal ============================ exists Fields1, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< exists Fields1. Subgoal 3: Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Fields1 IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx, listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen -> is_integer StoreLen -> is_integer CurrLen -> exists Fields, <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\ lookup Fields "null" trueVal NEq : L = Len -> false P : CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen IsCLen : is_integer CurrLen H1 : Len = L -> false Len : lookup Fields "null" falseVal Len1 : lookup Fields "tail" Tl Len2 : listLength Tl I * Len3 : I + 1 = CurrLen LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0 EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0 P' : 1 + StoreLen = N3 H2 : is_integer N3 EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0 IsI : is_integer I H3 : I + N3 = TotalLen H4 : <evalStmt {ES}> FE ([(Len, intVal N3), (L, Tl)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 H5 : lookup Fields1 "null" trueVal ============================ <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\ lookup Fields1 "null" trueVal
< search. Proof completed.
< Theorem while_to_length : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen. ============================ forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< induction on 1. IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen ============================ forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O @ -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< intros Ev LS IsSLen NEq. Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen Ev : evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O @ LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recFieldAccess (name L) "null") falseVal EE1 O2 * ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (name L) (recVal Fields) EE1 O2 * Ev5 : lookup Fields "null" falseVal ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O3 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Ev3. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert LV = recVal Fields. Subgoal 1.1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) ============================ LV = recVal Fields
< LS: case Ev. Subgoal 1.1.1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal LS1 : lookup [(Len, intVal StoreLen), (L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L: case LS1. Subgoal 1.1.1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : Len = L -> false L1 : lookup [(L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L': case L1. Subgoal 1.1.1.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : Len = L -> false ============================ recVal Fields = recVal Fields
< search. Subgoal 1.1.1.2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : Len = L -> false L' : L = L -> false L'1 : lookup [] L (recVal Fields) ============================ LV = recVal Fields
< apply L' to _. Subgoal 1.1.2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal LS1 : no_lookup [(Len, intVal StoreLen), (L, LV)] L LS2 : lookupScopes L Ctx (recVal Fields) ============================ LV = recVal Fields
< NL: case LS1. Subgoal 1.1.2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal LS2 : lookupScopes L Ctx (recVal Fields) NL : Len = L -> false NL1 : no_lookup [(L, LV)] L ============================ LV = recVal Fields
< NL': case NL1. Subgoal 1.1.2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal LS2 : lookupScopes L Ctx (recVal Fields) NL : Len = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ LV = recVal Fields
< apply NL' to _. Subgoal 1: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) Eq : LV = recVal Fields ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 * Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev1. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) EE3 O1 * Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 * Ev3 : O1 ++ O5 = O12 ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5 V EE4 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 * Ev3 : O1 ++ O5 = O12 Ev : evalExpr FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recFieldAccess (name L) "tail") V EE4 O1 * Ev6 : replaceScopes L V EE4 EE3 ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5 V EE4 Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 * Ev3 : O1 ++ O5 = O12 Ev6 : replaceScopes L V EE4 EE3 Ev : evalExpr FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (name L) (recVal Fields1) EE4 O1 * Ev7 : lookup Fields1 "tail" V ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O5 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 * Ev3 : [] ++ O5 = O12 Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Ev3. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert Fields1 = Fields. Subgoal 1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1) ============================ Fields1 = Fields
< LS': case Ev. Subgoal 1.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS' : lookup [] L (recVal Fields1) ============================ Fields1 = Fields
< case LS'. Subgoal 1.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS' : no_lookup [] L LS'1 : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields1) ============================ Fields1 = Fields
< clear LS'. Subgoal 1.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS'1 : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields1) ============================ Fields1 = Fields
< LS': case LS'1. Subgoal 1.2.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS' : lookup [(Len, intVal StoreLen), (L, recVal Fields)] L (recVal Fields1) ============================ Fields1 = Fields
< L: case LS'. Subgoal 1.2.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V L : Len = L -> false L1 : lookup [(L, recVal Fields)] L (recVal Fields1) ============================ Fields1 = Fields
< L': case L1. Subgoal 1.2.2.1.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields1 "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields1)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V L : Len = L -> false ============================ Fields1 = Fields1
< search. Subgoal 1.2.2.1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V L : Len = L -> false L' : L = L -> false L'1 : lookup [] L (recVal Fields1) ============================ Fields1 = Fields
< apply L' to _. Subgoal 1.2.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS' : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] L LS'1 : lookupScopes L Ctx (recVal Fields1) ============================ Fields1 = Fields
< NL: case LS'. Subgoal 1.2.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS'1 : lookupScopes L Ctx (recVal Fields1) NL : Len = L -> false NL1 : no_lookup [(L, recVal Fields)] L ============================ Fields1 = Fields
< NL': case NL1. Subgoal 1.2.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V LS'1 : lookupScopes L Ctx (recVal Fields1) NL : Len = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ Fields1 = Fields
< apply NL' to _. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields1 "tail" V Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1) Eq : Fields1 = Fields ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields "tail" V Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields "tail" V ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx). Subgoal 1.3: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields "tail" V ============================ EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< RS: case Ev6. Subgoal 1.3.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE (((L, V)::LRemain)::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [] RS1 : remove_all [] L LRemain ============================ ((L, V)::LRemain)::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< case RS. Subgoal 1.3.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::New) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : no_lookup [] L RS1 : replaceScopes L V ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) New ============================ []::New = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< clear RS. Subgoal 1.3.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::New) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS1 : replaceScopes L V ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) New ============================ []::New = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< RS: case RS1. Subgoal 1.3.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::LRemain)::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] RS1 : remove_all [(Len, intVal StoreLen), (L, recVal Fields)] L LRemain ============================ []::(((L, V)::LRemain)::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< RA: case RS1. Subgoal 1.3.2.1.1: Variables: StoreLen L FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes L Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = L -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (plus (name L) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::LRemain)::Ctx)) (assign L (plus (name L) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(L, intVal StoreLen), (L, recVal Fields)] RA : remove_all [(L, recVal Fields)] L LRemain ============================ []::(((L, V)::LRemain)::Ctx) = []::([(L, V), (L, intVal StoreLen)]::Ctx)
< apply NEq to _. Subgoal 1.3.2.1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] RA : Len = L -> false RA1 : remove_all [(L, recVal Fields)] L R ============================ []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< clear RA. Subgoal 1.3.2.1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] RA1 : remove_all [(L, recVal Fields)] L R ============================ []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< RA: case RA1. Subgoal 1.3.2.1.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] RA : remove_all [] L R ============================ []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< case RA. Subgoal 1.3.2.1.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] ============================ []::([(L, V), (Len, intVal StoreLen)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< search. Subgoal 1.3.2.1.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::((L, recVal Fields)::R1)))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)] RA : L = L -> false RA1 : remove_all [] L R1 ============================ []::(((L, V)::((Len, intVal StoreLen)::((L, recVal Fields)::R1)))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< apply RA to _. Subgoal 1.3.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] L RS1 : replaceScopes L V Ctx New1 ============================ []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< NL: case RS. Subgoal 1.3.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS1 : replaceScopes L V Ctx New1 NL : Len = L -> false NL1 : no_lookup [(L, recVal Fields)] L ============================ []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< NL': case NL1. Subgoal 1.3.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V RS1 : replaceScopes L V Ctx New1 NL : Len = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
< apply NL' to _. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3 Ev7 : lookup Fields "tail" V Eq : EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) Ev7 : lookup Fields "tail" V ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev6. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 * Ev7 : lookup Fields "tail" V ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev1. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V V1 EE5 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (plus (name Len) (num 1)) V1 EE5 O12 * Ev1 : replaceScopes Len V1 EE5 (Scope::EE2) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V EE5 I1 EE6 O6 I2 O7 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) EE5 (Scope::EE2) Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (name Len) (intVal I1) EE6 O6 * Ev3 : evalExpr FE EE6 (num 1) (intVal I2) EE5 O7 * Ev6 : I1 + I2 = I Ev8 : O6 ++ O7 = O12 ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Ev3. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V EE5 I1 O6 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) EE5 (Scope::EE2) Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (name Len) (intVal I1) EE5 O6 * Ev6 : I1 + 1 = I Ev8 : O6 ++ [] = O12 ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I Ev8 : [] ++ [] = O12 Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Ev8. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 * Ev4 : [] ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Ev4. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert I1 = StoreLen. Subgoal 1.4: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1) ============================ I1 = StoreLen
< LS': case Ev. Subgoal 1.4.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS' : lookup [] Len (intVal I1) ============================ I1 = StoreLen
< case LS'. Subgoal 1.4.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS' : no_lookup [] Len LS'1 : lookupScopes Len ([(L, V), (Len, intVal StoreLen)]::Ctx) (intVal I1) ============================ I1 = StoreLen
< clear LS'. Subgoal 1.4.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS'1 : lookupScopes Len ([(L, V), (Len, intVal StoreLen)]::Ctx) (intVal I1) ============================ I1 = StoreLen
< LS': case LS'1. Subgoal 1.4.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS' : lookup [(L, V), (Len, intVal StoreLen)] Len (intVal I1) ============================ I1 = StoreLen
< L: case LS'. Subgoal 1.4.2.1.1: Variables: StoreLen Len FE Ctx Ctx' FinalLen O Scope EE2 Fields I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : Len = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" (intVal I1) Ev1 : replaceScopes Len (intVal I) ([]::([(Len, intVal I1), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I ============================ I1 = StoreLen
< apply NEq to _. Subgoal 1.4.2.1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I L : L = Len -> false L1 : lookup [(Len, intVal StoreLen)] Len (intVal I1) ============================ I1 = StoreLen
< L': case L1. Subgoal 1.4.2.1.2.1: Variables: L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer I1 NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal I1)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I L : L = Len -> false ============================ I1 = I1
< search. Subgoal 1.4.2.1.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I L : L = Len -> false L' : Len = Len -> false L'1 : lookup [] Len (intVal I1) ============================ I1 = StoreLen
< apply L' to _. Subgoal 1.4.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS' : no_lookup [(L, V), (Len, intVal StoreLen)] Len LS'1 : lookupScopes Len Ctx (intVal I1) ============================ I1 = StoreLen
< NL: case LS'. Subgoal 1.4.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS'1 : lookupScopes Len Ctx (intVal I1) NL : L = Len -> false NL1 : no_lookup [(Len, intVal StoreLen)] Len ============================ I1 = StoreLen
< NL': case NL1. Subgoal 1.4.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I LS'1 : lookupScopes Len Ctx (intVal I1) NL : L = Len -> false NL' : Len = Len -> false NL'1 : no_lookup [] Len ============================ I1 = StoreLen
< apply NL' to _. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : I1 + 1 = I Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1) Eq : I1 = StoreLen ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : StoreLen + 1 = I Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal StoreLen) ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : StoreLen + 1 = I ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2. Subgoal 1.5: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : StoreLen + 1 = I ============================ []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2
< R: case Ev1. Subgoal 1.5.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [] R1 : remove_all [] Len LRemain ============================ []::([(Len, intVal I), (L, V)]::Ctx) = ((Len, intVal I)::LRemain)::([(L, V), (Len, intVal StoreLen)]::Ctx)
< case R. Subgoal 1.5.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : no_lookup [] Len R1 : replaceScopes Len (intVal I) ([(L, V), (Len, intVal StoreLen)]::Ctx) EE2 ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::EE2
< clear R. Subgoal 1.5.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R1 : replaceScopes Len (intVal I) ([(L, V), (Len, intVal StoreLen)]::Ctx) EE2 ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::EE2
< R: case R1. Subgoal 1.5.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE (((Len, intVal I)::LRemain)::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)] R1 : remove_all [(L, V), (Len, intVal StoreLen)] Len LRemain ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::LRemain)::Ctx)
< RA: case R1. Subgoal 1.5.2.1.1: Variables: StoreLen Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : Len = Len -> false Ev2 : evalStmt FE (((Len, intVal I)::LRemain)::Ctx) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(Len, V), (Len, intVal StoreLen)] RA : remove_all [(Len, intVal StoreLen)] Len LRemain ============================ []::([(Len, intVal I), (Len, V)]::Ctx) = []::(((Len, intVal I)::LRemain)::Ctx)
< apply NEq to _. Subgoal 1.5.2.1.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::R))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)] RA : L = Len -> false RA1 : remove_all [(Len, intVal StoreLen)] Len R ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::R))::Ctx)
< RA': case RA1. Subgoal 1.5.2.1.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::R))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)] RA : L = Len -> false RA' : remove_all [] Len R ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::R))::Ctx)
< case RA'. Subgoal 1.5.2.1.2.1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)] RA : L = Len -> false ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::([(Len, intVal I), (L, V)]::Ctx)
< search. Subgoal 1.5.2.1.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R1 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::((Len, intVal StoreLen)::R1)))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)] RA : L = Len -> false RA' : Len = Len -> false RA'1 : remove_all [] Len R1 ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::((Len, intVal StoreLen)::R1)))::Ctx)
< apply RA' to _. Subgoal 1.5.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R : no_lookup [(L, V), (Len, intVal StoreLen)] Len R1 : replaceScopes Len (intVal I) Ctx New ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
< NL: case R. Subgoal 1.5.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R1 : replaceScopes Len (intVal I) Ctx New NL : L = Len -> false NL1 : no_lookup [(Len, intVal StoreLen)] Len ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
< NL': case NL1. Subgoal 1.5.2.2: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I R1 : replaceScopes Len (intVal I) Ctx New NL : L = Len -> false NL' : Len = Len -> false NL'1 : no_lookup [] Len ============================ []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
< apply NL' to _. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2) Ev6 : StoreLen + 1 = I Eq : []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2 ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) ([]::([(Len, intVal I), (L, V)]::Ctx)) Ev6 : StoreLen + 1 = I ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev1. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< apply plus_integer_is_integer to _ _ Ev6. Subgoal 1: Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Sub: apply IH to Ev2 LS _ NEq. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< P: apply plus_integer_total to Sub1 _ with N2 = 1. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = N3 ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< apply plus_integer_is_integer to _ _ P. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = N3 H2 : is_integer N3 ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< AssocP: apply plus_integer_assoc to _ _ _ Ev6 Sub2. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 Subtotal' IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = N3 H2 : is_integer N3 AssocP : 1 + CurrLen = Subtotal' AssocP1 : StoreLen + Subtotal' = TotalLen ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< P': apply plus_integer_comm to _ _ P. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 Subtotal' IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = N3 H2 : is_integer N3 AssocP : 1 + CurrLen = Subtotal' AssocP1 : StoreLen + Subtotal' = TotalLen P' : 1 + CurrLen = N3 ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< apply plus_integer_unique to P' AssocP. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen Subtotal' IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = Subtotal' H2 : is_integer Subtotal' AssocP : 1 + CurrLen = Subtotal' AssocP1 : StoreLen + Subtotal' = TotalLen P' : 1 + CurrLen = Subtotal' ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< apply plus_integer_comm to _ _ AssocP1. Subgoal 1: Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen Subtotal' IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] * Ev5 : lookup Fields "null" falseVal Ev7 : lookup Fields "tail" V Ev6 : StoreLen + 1 = I H1 : is_integer I Sub : listLength V CurrLen Sub1 : is_integer CurrLen Sub2 : CurrLen + I = TotalLen P : CurrLen + 1 = Subtotal' H2 : is_integer Subtotal' AssocP : 1 + CurrLen = Subtotal' AssocP1 : StoreLen + Subtotal' = TotalLen P' : 1 + CurrLen = Subtotal' H3 : Subtotal' + StoreLen = TotalLen ============================ exists Scope TotalLen1 CurrLen, (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\ intVal TotalLen = intVal TotalLen1) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen1
< search. Subgoal 2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal Ctx' O * ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recFieldAccess (name L) "null") trueVal Ctx' O * ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 2: Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len Ctx' FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (name L) (recVal Fields) Ctx' O * Ev1 : lookup Fields "null" trueVal ============================ exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Ev: case Ev. Subgoal 2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, LV)]::Ctx = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert LV = recVal Fields. Subgoal 2.1: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) ============================ LV = recVal Fields
< LS': case Ev. Subgoal 2.1.1: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS' : lookup [(Len, intVal StoreLen), (L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L: case LS'. Subgoal 2.1.1: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal L : Len = L -> false L1 : lookup [(L, LV)] L (recVal Fields) ============================ LV = recVal Fields
< L': case L1. Subgoal 2.1.1.1: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal L : Len = L -> false ============================ recVal Fields = recVal Fields
< search. Subgoal 2.1.1.2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal L : Len = L -> false L' : L = L -> false L'1 : lookup [] L (recVal Fields) ============================ LV = recVal Fields
< apply L' to _. Subgoal 2.1.2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS' : no_lookup [(Len, intVal StoreLen), (L, LV)] L LS'1 : lookupScopes L Ctx (recVal Fields) ============================ LV = recVal Fields
< NL: case LS'. Subgoal 2.1.2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS'1 : lookupScopes L Ctx (recVal Fields) NL : Len = L -> false NL1 : no_lookup [(L, LV)] L ============================ LV = recVal Fields
< NL': case NL1. Subgoal 2.1.2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS'1 : lookupScopes L Ctx (recVal Fields) NL : Len = L -> false NL' : L = L -> false NL'1 : no_lookup [] L ============================ LV = recVal Fields
< apply NL' to _. Subgoal 2: Variables: LV StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields) Eq : LV = recVal Fields ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, LV)]::Ctx = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields) ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< clear Ev. Subgoal 2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< Eq: assert FinalLen = intVal StoreLen. Subgoal 2.2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal ============================ FinalLen = intVal StoreLen
< LS: case LS. Subgoal 2.2.1: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS : lookup [(Len, intVal StoreLen), (L, recVal Fields)] Len FinalLen ============================ FinalLen = intVal StoreLen
< L: case LS. Subgoal 2.2.1.1: Variables: StoreLen L Len FE Ctx Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal ============================ intVal StoreLen = intVal StoreLen
< search. Subgoal 2.2.1.2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal L : Len = Len -> false L1 : lookup [(L, recVal Fields)] Len FinalLen ============================ FinalLen = intVal StoreLen
< apply L to _. Subgoal 2.2.2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] Len LS1 : lookupScopes Len Ctx FinalLen ============================ FinalLen = intVal StoreLen
< NL: case LS. Subgoal 2.2.2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal LS1 : lookupScopes Len Ctx FinalLen NL : Len = Len -> false NL1 : no_lookup [(L, recVal Fields)] Len ============================ FinalLen = intVal StoreLen
< apply NL to _. Subgoal 2: Variables: StoreLen L Len FE Ctx FinalLen Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal Eq : FinalLen = intVal StoreLen ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< case Eq. Subgoal 2: Variables: StoreLen L Len FE Ctx Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (intVal StoreLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\ intVal StoreLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< P: assert 0 + StoreLen = StoreLen. Subgoal 2: Variables: StoreLen L Len FE Ctx Fields IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O, evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * -> lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) -> exists Scope TotalLen CurrLen, ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\ listLength LV CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (intVal StoreLen) IsSLen : is_integer StoreLen NEq : L = Len -> false Ev1 : lookup Fields "null" trueVal P : 0 + StoreLen = StoreLen ============================ exists Scope TotalLen CurrLen, (((([] = [] /\ [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\ intVal StoreLen = intVal TotalLen) /\ listLength (recVal Fields) CurrLen) /\ is_integer CurrLen) /\ CurrLen + StoreLen = TotalLen
< search. Proof completed.
< Extensible_Theorem iterateList_dot_null : forall FE EE V X Body EE' O, IL : iterateList FE EE V X Body EE' O -> exists Fs, V = recVal Fs /\ (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal) on IL. Subgoal 1: Variables: FE X Body EE' Fields IH : forall FE EE V X Body EE' O, iterateList FE EE V X Body EE' O * -> exists Fs, V = recVal Fs /\ (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal) IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ exists Fs, recVal Fields = recVal Fs /\ (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
< search. Subgoal 2: Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields IH : forall FE EE V X Body EE' O, iterateList FE EE V X Body EE' O * -> exists Fs, V = recVal Fs /\ (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal) IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ exists Fs, recVal Fields = recVal Fs /\ (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
< search. Proof completed.
< Theorem iterateList_to_while : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O. ============================ forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< induction on 6. IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O ============================ forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O @ -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< intros IsV IsX IsBody IsFE IsEE IL Names Fr. Variables: FE EE V X Body EE' O Names L IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE V X Body EE' O @ Names : names EE Names Fr : fresh_name "L" (X::Names) L ============================ exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< Or: apply iterateList_dot_null to IL. Variables: FE EE X Body EE' O Names L Fs IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsV : is_value (recVal Fs) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fs) X Body EE' O @ Names : names EE Names Fr : fresh_name "L" (X::Names) L Or : lookup Fs "null" trueVal \/ lookup Fs "null" falseVal ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< clear Or. Variables: FE EE X Body EE' O Names L Fs IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsV : is_value (recVal Fs) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fs) X Body EE' O @ Names : names EE Names Fr : fresh_name "L" (X::Names) L ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< IL: case IL. Subgoal 1: Variables: FE X Body EE' Names L Fs IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsV : is_value (recVal Fs) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Names : names EE' Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" trueVal ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') []
< search 20. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsV : is_value (recVal Fs) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< case IsV. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< apply lookup_is_value to _ IL1. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< apply lookup_is_value to _ IL3. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< IsEE''+: apply evalStmt_isCtx to _ _ _ IL2. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< IsEE'': case IsEE''+. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE3 Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< NS: apply evalStmt_names_same to _ _ _ IL2. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< Names'': apply names_exists to IsEE''1. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< IsN: apply names_is to _ Names''. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< Fr': apply fresh_name_exists to _ _ with Base = "L" Names = X::N. Subgoal 2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ exists V', evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
< apply fresh_name_unique_mems to Fr Fr' _ _. Subgoal 2.1: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ forall X1, mem X1 (X::N) -> mem X1 (X::Names)
< intros M. Subgoal 2.1: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 (X::N) ============================ mem X1 (X::Names)
< M: case M. Subgoal 2.1.1: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ mem X (X::Names)
< search. Subgoal 2.1.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 N ============================ mem X1 (X::Names)
< NS': apply names_same_symmetric to NS. Subgoal 2.1.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 N NS' : names_same EE'' EE ============================ mem X1 (X::Names)
< apply names_same_names to NS' Names'' Names M. Subgoal 2.1.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 N NS' : names_same EE'' EE H4 : mem X1 Names ============================ mem X1 (X::Names)
< search. Subgoal 2.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ forall X1, mem X1 (X::Names) -> mem X1 (X::N)
< intros M. Subgoal 2.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 (X::Names) ============================ mem X1 (X::N)
< M: case M. Subgoal 2.2.1: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ mem X (X::N)
< search. Subgoal 2.2.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 Names ============================ mem X1 (X::N)
< apply names_same_names to NS Names Names'' M. Subgoal 2.2.2: Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) L IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F M : mem X1 Names H4 : mem X1 N ============================ mem X1 (X::N)
< search. Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F ============================ exists V', evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
< EvSub: apply IH to _ _ _ _ _ IL4 Names'' Fr'. Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ exists V', evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
< exists V'. Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
< unfold . Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ exists EE1 O1 Scope EE2 O2 O3 O12, evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal EE1 O1 /\ (evalStmt FE ([]::EE1) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope::EE2) O2 /\ (evalStmt FE EE2 (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\ (O1 ++ O2 = O12 /\ O12 ++ O3 = O)))
< exists [(F, recVal Fs)]::EE, [], Scope'. Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ exists EE2 O2 O3 O12, evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) [] /\ (evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::EE2) O2 /\ (evalStmt FE EE2 (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\ ([] ++ O2 = O12 /\ O12 ++ O3 = O)))
< exists [(F, Tl)]::EE'', O2, O3, O2. Subgoal 2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) [] /\ (evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::([(F, Tl)]::EE'')) O2 /\ (evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\ ([] ++ O2 = O2 /\ O2 ++ O3 = O)))
< split. Subgoal 2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) []
< search. Subgoal 2.4: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::([(F, Tl)]::EE'')) O2
< unfold . Subgoal 2.4: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ exists EE1 O1 O3, evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) EE1 O1 /\ (evalStmt FE EE1 (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O3 /\ O1 ++ O3 = O2)
< exists [(X, Hd)]::([(F, recVal Fs)]::EE), [], O2. Subgoal 2.4: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, recVal Fs)]::EE)) [] /\ (evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2 /\ [] ++ O2 = O2)
< split. Subgoal 2.4.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, recVal Fs)]::EE)) []
< search 20. Subgoal 2.4.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2
< NEq: assert X = F -> false. Subgoal 2.4.2.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ X = F -> false
< intros E. Subgoal 2.4.2.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 E : X = F ============================ false
< case E. Subgoal 2.4.2.1: Variables: FE EE Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string F IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (F::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(F, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl F Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (F::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy F (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 2.4.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2
< unfold . Subgoal 2.4.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ exists EE1 O1 O3, evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) EE1 O1 /\ (evalStmt FE EE1 Body (Scope'::([(F, Tl)]::EE'')) O3 /\ O1 ++ O3 = O2)
< exists [(X, Hd)]::([(F, Tl)]::EE), [], O2. Subgoal 2.4.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) ([(X, Hd)]::([(F, Tl)]::EE)) [] /\ (evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2 /\ [] ++ O2 = O2)
< split. Subgoal 2.4.2.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) ([(X, Hd)]::([(F, Tl)]::EE)) []
< search 10. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' N1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE N1 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< rename N1 to Len. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< NNS: assert newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE. Subgoal 2.4.2.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
< unfold . Subgoal 2.4.2.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([(F, Tl)]::EE) EE) /\ take N ([(F, Tl)]::EE) [[(F, Tl)]]) /\ names [[(F, Tl)]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [F], Names. Subgoal 2.4.2.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ ((((length EE Len /\ drop 1 ([(F, Tl)]::EE) EE) /\ take 1 ([(F, Tl)]::EE) [[(F, Tl)]]) /\ names [[(F, Tl)]] [F]) /\ names EE Names) /\ (forall X, mem X [F] -> mem X Names -> false)
< split. Subgoal 2.4.2.3.1.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ length EE Len
< search. Subgoal 2.4.2.3.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ drop 1 ([(F, Tl)]::EE) EE
< search. Subgoal 2.4.2.3.1.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ take 1 ([(F, Tl)]::EE) [[(F, Tl)]]
< search. Subgoal 2.4.2.3.1.4: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ names [[(F, Tl)]] [F]
< search. Subgoal 2.4.2.3.1.5: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ names EE Names
< search. Subgoal 2.4.2.3.1.6: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len ============================ forall X, mem X [F] -> mem X Names -> false
< intros M MN. Subgoal 2.4.2.3.1.6: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len M : mem X1 [F] MN : mem X1 Names ============================ false
< M: case M. Subgoal 2.4.2.3.1.6.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len MN : mem F Names ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 2.4.2.3.1.6.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len MN : mem X1 Names M : mem X1 [] ============================ false
< case M. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply fresh_name_is to _ Fr. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Ev: apply evalStmt_newNameScopes_exists to _ _ _ _ IL2 NNS. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< NNS': apply evalStmt_newNameScopes to _ _ _ _ Ev IL2 _. Subgoal 2.4.2.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2 NNS' : newNameScopes [[(F, Tl)]] Len EE_A' (Scope'::EE'') ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< NNS': case NNS'. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A' N1 SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2 NNS' : length (Scope'::EE'') Len NNS'1 : drop N1 EE_A' (Scope'::EE'') NNS'2 : take N1 EE_A' [[(F, Tl)]] NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Take: case NNS'2. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames N2 L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'1 : drop N1 ([(F, Tl)]::L1) (Scope'::EE'') NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L1 [] ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< case Take1. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'1 : drop N1 ([(F, Tl)]::L1) (Scope'::EE'') NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< compute Take. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'1 : drop 1 ([(F, Tl)]::L1) (Scope'::EE'') NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Drop: case NNS'1. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 (Scope'::EE'') ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply drop_is_integer to Drop1. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 (Scope'::EE'') H5 : is_integer N3 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 (Scope'::EE'') H5 : is_integer 0 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Eq: assert L1 = Scope'::EE''. Subgoal 2.4.2.3.2.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 (Scope'::EE'') H5 : is_integer 0 ============================ L1 = Scope'::EE''
< D: case Drop1. Subgoal 2.4.2.3.2.1.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 ============================ Scope'::EE'' = Scope'::EE''
< search. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 (Scope'::EE'') ============================ X1::L2 = Scope'::EE''
< apply drop_is_integer to D1. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 (Scope'::EE'') H6 : is_integer N4 ============================ X1::L2 = Scope'::EE''
< P: assert 1 + -1 = 0. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 (Scope'::EE'') H6 : is_integer N4 P : 1 + -1 = 0 ============================ X1::L2 = Scope'::EE''
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 (Scope'::EE'') H6 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L2 = Scope'::EE''
< GEq: apply drop_geq_0 to D1. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 (Scope'::EE'') H6 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X1::L2 = Scope'::EE''
< LEq: case GEq. Subgoal 2.4.2.3.2.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 (Scope'::EE'') H6 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L2 = Scope'::EE''
< case LEq. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 (Scope'::EE'') H5 : is_integer 0 Eq : L1 = Scope'::EE'' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< case Eq. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 (Scope'::EE'') (Scope'::EE'') H5 : is_integer 0 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< clear Take Drop Drop1. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS' : length (Scope'::EE'') Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Len: case NNS'. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 Len : length EE'' N' Len1 : 1 + N' = Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply length_is to Len. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 Len : length EE'' N' Len1 : 1 + N' = Len H6 : is_integer N' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< L: apply lt_plus_one to Len1 _. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 Len : length EE'' N' Len1 : 1 + N' = Len H6 : is_integer N' L : N' < Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Len'': apply names_same_length to NS LenEE. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 Len : length EE'' N' Len1 : 1 + N' = Len H6 : is_integer N' L : N' < Len Len'' : length EE'' Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply length_unique to Len'' Len. Subgoal 2.4.2.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' SNames BNames N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE N' NNS : newNameScopes [[(F, Tl)]] N' ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2 NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names (Scope'::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H5 : is_integer 0 Len : length EE'' N' Len1 : 1 + N' = N' H6 : is_integer N' L : N' < N' Len'' : length EE'' N' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply less_integer_not_eq to L. Subgoal 2.4.2.3.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len AR IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::AR) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR EE'' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< NNS': case NNS'. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len AR N1 SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::AR) O2 NNS' : length EE'' Len NNS'1 : drop N1 AR EE'' NNS'2 : take N1 AR [[(F, Tl)]] NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Take: case NNS'2. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames N2 L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'1 : drop N1 ([(F, Tl)]::L1) EE'' NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L1 [] ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< case Take1. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'1 : drop N1 ([(F, Tl)]::L1) EE'' NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< compute Take. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'1 : drop 1 ([(F, Tl)]::L1) EE'' NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Drop: case NNS'1. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 EE'' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply drop_is_integer to Drop1. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 EE'' H5 : is_integer N3 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE'' H5 : is_integer 0 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< Eq: assert L1 = EE''. Subgoal 2.4.2.3.3.1.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE'' H5 : is_integer 0 ============================ L1 = EE''
< D: case Drop1. Subgoal 2.4.2.3.3.1.1.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 ============================ EE'' = EE''
< search. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 EE'' ============================ X1::L2 = EE''
< P: assert 1 + -1 = 0. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 EE'' P : 1 + -1 = 0 ============================ X1::L2 = EE''
< apply drop_is_integer to D1. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 EE'' P : 1 + -1 = 0 H6 : is_integer N4 ============================ X1::L2 = EE''
< apply plus_integer_unique_addend to _ _ _ D P. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE'' P : 1 + -1 = 0 H6 : is_integer -1 ============================ X1::L2 = EE''
< GEq: apply drop_geq_0 to D1. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE'' P : 1 + -1 = 0 H6 : is_integer -1 GEq : -1 >= 0 ============================ X1::L2 = EE''
< LEq: case GEq. Subgoal 2.4.2.3.3.1.1.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE'' P : 1 + -1 = 0 H6 : is_integer -1 LEq : 0 <= -1 ============================ X1::L2 = EE''
< case LEq. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE'' H5 : is_integer 0 Eq : L1 = EE'' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< case Eq. Subgoal 2.4.2.3.3.1: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2 NNS' : length EE'' Len NNS'3 : names [[(F, Tl)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE'' EE'' H5 : is_integer 0 ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
< search. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< LenBR+: apply names_same_length to NS LenEE. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR LenBR+ : length (S::BR) Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< LenBR: case LenBR+. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< apply length_is to LenBR. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H5 : is_integer N' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< L: apply lt_plus_one to LenBR1 _. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H5 : is_integer N' L : N' < Len ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 2.4.2.3.3.2: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE (S::BR) Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR) NS : names_same EE (S::BR) Names'' : names (S::BR) N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false LenEE : length EE Len NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE H4 : is_string F Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2 NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H5 : is_integer N' L : N' < Len LEq : Len <= N' ============================ evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
< apply less_lesseq_flip_false to L LEq. Subgoal 2.4.2.4: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 NEq : X = F -> false ============================ [] ++ O2 = O2
< search. Subgoal 2.4.3: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ [] ++ O2 = O2
< search. Subgoal 2.5: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
< search. Subgoal 2.6: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ [] ++ O2 = O2
< search. Subgoal 2.7: Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' IH : forall FE EE V X Body EE' O Names L, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> names EE Names -> fresh_name "L" (X::Names) L -> exists V', evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Names : names EE Names Fr : fresh_name "L" (X::Names) F IL : lookup Fs "null" falseVal IL1 : lookup Fs "head" Hd IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 * IL3 : lookup Fs "tail" Tl IL4 : iterateList FE EE'' Tl X Body EE' O3 * IL5 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fs H2 : is_value Hd H3 : is_value Tl IsEE'' : is_list (is_pair is_string is_value) Scope' IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE'' NS : names_same EE EE'' Names'' : names EE'' N IsN : is_list is_string N Fr' : fresh_name "L" (X::N) F EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 ============================ O2 ++ O3 = O
< search. Proof completed.
< Theorem while_to_iterateList : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O -> iterateList FE EE V X Body EE' O. ============================ forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O -> iterateList FE EE V X Body EE' O
< induction on 11. IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O ============================ forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O @ -> iterateList FE EE V X Body EE' O
< intros IsV IsX IsBody IsFE IsEE IsCtx Names Fr CN BN Ev. Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev : evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O @ ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev : evalExpr FE ([(L, V)]::EE) (not (null (name L))) trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev : evalExpr FE ([(L, V)]::EE) (null (name L)) falseVal EE2 O2 * ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev : evalExpr FE ([(L, V)]::EE) (name L) (recVal Fields) EE2 O2 * Ev5 : lookup Fields "null" falseVal ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields) ============================ iterateList FE EE V X Body EE' O
< Eq: assert V = recVal Fields. Subgoal 1.1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields) ============================ V = recVal Fields
< L: case Ev. Subgoal 1.1.1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : lookup [(L, V)] L (recVal Fields) ============================ V = recVal Fields
< L: case L. Subgoal 1.1.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal ============================ recVal Fields = recVal Fields
< search. Subgoal 1.1.1.2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : L = L -> false L1 : lookup [] L (recVal Fields) ============================ V = recVal Fields
< case L1. Subgoal 1.1.2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L : no_lookup [(L, V)] L L1 : lookupScopes L EE (recVal Fields) ============================ V = recVal Fields
< NL: case L. Subgoal 1.1.2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal L1 : lookupScopes L EE (recVal Fields) NL : L = L -> false NL1 : no_lookup [] L ============================ V = recVal Fields
< apply NL to _. Subgoal 1: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields) Eq : V = recVal Fields ============================ iterateList FE EE V X Body EE' O
< case Eq. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev3 : [] ++ O3 = O12 Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Ev3. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O12 * Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev1. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields EE1 O1 O5 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (declare intTy X (head (name L))) EE1 O1 * Ev3 : evalStmt FE EE1 (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : O1 ++ O5 = O12 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev1. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O1 O5 EE5 Scope1 V1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE (((X, V1)::Scope1)::EE5) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : O1 ++ O5 = O12 Ev1 : evalExpr FE ([]::([(L, recVal Fields)]::EE)) (head (name L)) V1 (Scope1::EE5) O1 * ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev1. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O1 O5 EE5 Scope1 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE (((X, V1)::Scope1)::EE5) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : O1 ++ O5 = O12 Ev1 : evalExpr FE ([]::([(L, recVal Fields)]::EE)) (name L) (recVal Fields1) (Scope1::EE5) O1 * Ev7 : lookup Fields1 "head" V1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev1. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Eq: assert Fields1 = Fields. Subgoal 1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1) ============================ Fields1 = Fields
< LS: case Ev1. Subgoal 1.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : lookup [] L (recVal Fields1) ============================ Fields1 = Fields
< case LS. Subgoal 1.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L LS1 : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields1) ============================ Fields1 = Fields
< LS': case LS1. Subgoal 1.2.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L LS' : lookup [(L, recVal Fields)] L (recVal Fields1) ============================ Fields1 = Fields
< L: case LS'. Subgoal 1.2.2.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields1) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields1 "null" falseVal Ev : lookupScopes L ([(L, recVal Fields1)]::EE) (recVal Fields1) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields1)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L ============================ Fields1 = Fields1
< search. Subgoal 1.2.2.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L L : L = L -> false L1 : lookup [] L (recVal Fields1) ============================ Fields1 = Fields
< apply L to _. Subgoal 1.2.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L LS' : no_lookup [(L, recVal Fields)] L LS'1 : lookupScopes L EE (recVal Fields1) ============================ Fields1 = Fields
< NL: case LS'. Subgoal 1.2.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 LS : no_lookup [] L LS'1 : lookupScopes L EE (recVal Fields1) NL : L = L -> false NL1 : no_lookup [] L ============================ Fields1 = Fields
< apply NL to _. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields1 "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1) Eq : Fields1 = Fields ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Eq. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 * Ev6 : [] ++ O5 = O12 Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Ev6. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O12 * Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev3. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (assign L (tail (name L))) EE3 O6 * Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 * Ev8 : O6 ++ O7 = O12 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev3. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7 V2 EE6 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 * Ev8 : O6 ++ O7 = O12 Ev3 : evalExpr FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (tail (name L)) V2 EE6 O6 * Ev9 : replaceScopes L V2 EE6 EE3 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev3. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7 V2 EE6 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 * Ev8 : O6 ++ O7 = O12 Ev9 : replaceScopes L V2 EE6 EE3 Ev3 : evalExpr FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (name L) (recVal Fields2) EE6 O6 * Ev10 : lookup Fields2 "tail" V2 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Ev: case Ev3. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O7 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 * Ev8 : [] ++ O7 = O12 Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Ev8. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Eq: assert Fields2 = Fields. Subgoal 1.3: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2) ============================ Fields2 = Fields
< LS: case Ev3. Subgoal 1.3.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : lookup [(X, V1)] L (recVal Fields2) ============================ Fields2 = Fields
< L: case LS. Subgoal 1.3.1.1: Variables: FE EE Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string L IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (L::Names) L CN : ctx_names EE Ctx BN : stmtNames ([L]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy L (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" (recVal Fields2) Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(L, recVal Fields2)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 ============================ Fields2 = Fields
< apply fresh_name_not_mem to Fr _. Subgoal 1.3.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 L : X = L -> false L1 : lookup [] L (recVal Fields2) ============================ Fields2 = Fields
< case L1. Subgoal 1.3.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L LS1 : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields2) ============================ Fields2 = Fields
< LS': case LS1. Subgoal 1.3.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L LS' : lookup [(L, recVal Fields)] L (recVal Fields2) ============================ Fields2 = Fields
< L: case LS'. Subgoal 1.3.2.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields2) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields2 "null" falseVal Ev : lookupScopes L ([(L, recVal Fields2)]::EE) (recVal Fields2) Ev7 : lookup Fields2 "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields2)]::EE)) (recVal Fields2) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields2)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L ============================ Fields2 = Fields2
< search. Subgoal 1.3.2.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L L : L = L -> false L1 : lookup [] L (recVal Fields2) ============================ Fields2 = Fields
< apply L to _. Subgoal 1.3.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L LS' : no_lookup [(L, recVal Fields)] L LS'1 : lookupScopes L EE (recVal Fields2) ============================ Fields2 = Fields
< NL: case LS'. Subgoal 1.3.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 LS : no_lookup [(X, V1)] L LS'1 : lookupScopes L EE (recVal Fields2) NL : L = L -> false NL1 : no_lookup [] L ============================ Fields2 = Fields
< apply NL to _. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields2 "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2) Eq : Fields2 = Fields ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Eq. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Eq: assert EE3 = [(X, V1)]::([(L, V2)]::EE). Subgoal 1.4: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) ============================ EE3 = [(X, V1)]::([(L, V2)]::EE)
< RS: case Ev9. Subgoal 1.4.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE (((L, V2)::LRemain)::([(L, recVal Fields)]::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : mem (L, I) [(X, V1)] RS1 : remove_all [(X, V1)] L LRemain ============================ ((L, V2)::LRemain)::([(L, recVal Fields)]::EE) = [(X, V1)]::([(L, V2)]::EE)
< M: case RS. Subgoal 1.4.1.1: Variables: FE EE X Body Scope' EE' O Names Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 LRemain IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) X CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name X))) (seq (declare intTy X (head (name X))) (seq (assign X (tail (name X))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes X ([(X, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes X ([]::([(X, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE (((X, V2)::LRemain)::([(X, recVal Fields)]::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes X ([(X, V1)]::([(X, recVal Fields)]::EE)) (recVal Fields) RS1 : remove_all [(X, V1)] X LRemain ============================ ((X, V2)::LRemain)::([(X, recVal Fields)]::EE) = [(X, V1)]::([(X, V2)]::EE)
< apply fresh_name_not_mem to Fr _. Subgoal 1.4.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE (((L, V2)::LRemain)::([(L, recVal Fields)]::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS1 : remove_all [(X, V1)] L LRemain M : mem (L, I) [] ============================ ((L, V2)::LRemain)::([(L, recVal Fields)]::EE) = [(X, V1)]::([(L, V2)]::EE)
< case M. Subgoal 1.4.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::New) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS1 : replaceScopes L V2 ([(L, recVal Fields)]::EE) New ============================ [(X, V1)]::New = [(X, V1)]::([(L, V2)]::EE)
< RS': case RS1. Subgoal 1.4.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::LRemain)::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS' : mem (L, I) [(L, recVal Fields)] RS'1 : remove_all [(L, recVal Fields)] L LRemain ============================ [(X, V1)]::(((L, V2)::LRemain)::EE) = [(X, V1)]::([(L, V2)]::EE)
< RA: case RS'1. Subgoal 1.4.2.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::LRemain)::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS' : mem (L, I) [(L, recVal Fields)] RA : remove_all [] L LRemain ============================ [(X, V1)]::(((L, V2)::LRemain)::EE) = [(X, V1)]::([(L, V2)]::EE)
< case RA. Subgoal 1.4.2.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS' : mem (L, I) [(L, recVal Fields)] ============================ [(X, V1)]::([(L, V2)]::EE) = [(X, V1)]::([(L, V2)]::EE)
< search. Subgoal 1.4.2.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I R IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::((L, recVal Fields)::R))::EE)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS' : mem (L, I) [(L, recVal Fields)] RA : L = L -> false RA1 : remove_all [] L R ============================ [(X, V1)]::(((L, V2)::((L, recVal Fields)::R))::EE) = [(X, V1)]::([(L, V2)]::EE)
< apply RA to _. Subgoal 1.4.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::New1)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS' : no_lookup [(L, recVal Fields)] L RS'1 : replaceScopes L V2 EE New1 ============================ [(X, V1)]::([(L, recVal Fields)]::New1) = [(X, V1)]::([(L, V2)]::EE)
< NL: case RS'. Subgoal 1.4.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::New1)) Body (Scope::EE4) O12 * Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) RS : no_lookup [(X, V1)] L RS'1 : replaceScopes L V2 EE New1 NL : L = L -> false NL1 : no_lookup [] L ============================ [(X, V1)]::([(L, recVal Fields)]::New1) = [(X, V1)]::([(L, V2)]::EE)
< apply NL to _. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3 Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Eq : EE3 = [(X, V1)]::([(L, V2)]::EE) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Eq. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NNS: assert newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE. Subgoal 1.5: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
< unfold . Subgoal 1.5: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 ([(L, V2)]::EE) EE) /\ take N1 ([(L, V2)]::EE) [[(L, V2)]]) /\ names [[(L, V2)]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [L], Names. Subgoal 1.5: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ ((((length EE N /\ drop 1 ([(L, V2)]::EE) EE) /\ take 1 ([(L, V2)]::EE) [[(L, V2)]]) /\ names [[(L, V2)]] [L]) /\ names EE Names) /\ (forall X, mem X [L] -> mem X Names -> false)
< split. Subgoal 1.5.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ length EE N
< search. Subgoal 1.5.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ drop 1 ([(L, V2)]::EE) EE
< search. Subgoal 1.5.3: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ take 1 ([(L, V2)]::EE) [[(L, V2)]]
< search. Subgoal 1.5.4: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ names [[(L, V2)]] [L]
< search. Subgoal 1.5.5: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ names EE Names
< search. Subgoal 1.5.6: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N ============================ forall X, mem X [L] -> mem X Names -> false
< intros M MN. Subgoal 1.5.6: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N M : mem X1 [L] MN : mem X1 Names ============================ false
< M: case M. Subgoal 1.5.6.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N MN : mem L Names ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 1.5.6.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N MN : mem X1 Names M : mem X1 [] ============================ false
< case M. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ iterateList FE EE (recVal Fields) X Body EE' O
< assert ctx_names ([(X, V1)]::EE) ([X]::Ctx). Subgoal 1.6: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ ctx_names ([(X, V1)]::EE) ([X]::Ctx)
< unfold . Subgoal 1.6.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ forall K I, mem (K, I) [(X, V1)] -> mem K [X]
< intros M. Subgoal 1.6.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K I IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE M : mem (K, I) [(X, V1)] ============================ mem K [X]
< M: case M. Subgoal 1.6.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ mem X [X]
< search. Subgoal 1.6.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K I IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE M : mem (K, I) [] ============================ mem K [X]
< case M. Subgoal 1.6.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ forall K, mem K [X] -> exists I, mem (K, I) [(X, V1)]
< intros M. Subgoal 1.6.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE M : mem K [X] ============================ exists I, mem (K, I) [(X, V1)]
< M: case M. Subgoal 1.6.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ exists I, mem (X, I) [(X, V1)]
< search. Subgoal 1.6.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE M : mem K [] ============================ exists I, mem (K, I) [(X, V1)]
< case M. Subgoal 1.6.3: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE ============================ ctx_names EE Ctx
< search. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply fresh_name_is to _ Fr. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L ============================ iterateList FE EE (recVal Fields) X Body EE' O
< IsR: apply lookupScopes_is to _ Ev. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR : is_value (recVal Fields) IsR1 : is_string L ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case IsR. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply lookup_is_value to _ Ev7. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply lookup_is_value to _ Ev10. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< EvB: apply evalStmt_newNameScopes_exists_back to _ _ _ _ _ _ BN Ev6 NNS. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NNS': apply evalStmt_newNameScopes to _ _ _ _ Ev6 EvB NNS. Subgoal 1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : newNameScopes [[(L, V2)]] N (Scope::EE4) EE_B' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NNS': case NNS'. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'1 : drop N1 (Scope::EE4) EE_B' NNS'2 : take N1 (Scope::EE4) [[(L, V2)]] NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Take: case NNS'2. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames N2 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'1 : drop N1 ([(L, V2)]::EE4) EE_B' NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 EE4 [] ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Take1. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'1 : drop N1 ([(L, V2)]::EE4) EE_B' NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< compute Take. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'1 : drop 1 ([(L, V2)]::EE4) EE_B' NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Drop: case NNS'1. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames N3 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 EE4 EE_B' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply drop_is_integer to Drop1. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames N3 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 EE4 EE_B' H6 : is_integer N3 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE4 EE_B' H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Eq: assert EE4 = EE_B'. Subgoal 1.7.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE4 EE_B' H6 : is_integer 0 ============================ EE4 = EE_B'
< D: case Drop1. Subgoal 1.7.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 ============================ EE_B' = EE_B'
< search. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L1 EE_B' ============================ X1::L1 = EE_B'
< apply drop_is_integer to D1. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L1 EE_B' H7 : is_integer N4 ============================ X1::L1 = EE_B'
< P: assert 1 + -1 = 0. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L1 EE_B' H7 : is_integer N4 P : 1 + -1 = 0 ============================ X1::L1 = EE_B'
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H7 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L1 = EE_B'
< GEq: apply drop_geq_0 to D1. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H7 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X1::L1 = EE_B'
< LEq: case GEq. Subgoal 1.7.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H7 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L1 = EE_B'
< case LEq. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE4 EE_B' H6 : is_integer 0 Eq : EE4 = EE_B' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Eq. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE_B' EE_B' H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< clear Take Drop Drop1. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12 NNS' : length EE_B' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NS: apply evalStmt_names_same to _ _ _ EvB. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS' : length (Scope'1::EE'') N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< LenEE'': apply names_same_length to NS Len. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS' : length (Scope'1::EE'') N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' LenEE'' : length EE'' N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< LenNNS: case NNS'. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE'' N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' LenEE'' : length EE'' N LenNNS : length EE'' N' LenNNS1 : 1 + N' = N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply length_unique to LenEE'' LenNNS. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N' NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' LenEE'' : length EE'' N' LenNNS : length EE'' N' LenNNS1 : 1 + N' = N' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply length_is to LenEE''. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N' NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' LenEE'' : length EE'' N' LenNNS : length EE'' N' LenNNS1 : 1 + N' = N' H7 : is_integer N' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< L: apply lt_plus_one to LenNNS1 _. Subgoal 1.7: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N' NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12 NNS'3 : names [[(L, V2)]] SNames NNS'4 : names (Scope'1::EE'') BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 NS : names_same EE EE'' LenEE'' : length EE'' N' LenNNS : length EE'' N' LenNNS1 : 1 + N' = N' H7 : is_integer N' L : N' < N' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply less_integer_not_eq to L. Subgoal 1.8: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N BR IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : newNameScopes [[(L, V2)]] N EE4 BR ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NNS': case NNS'. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N BR N1 SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'1 : drop N1 EE4 BR NNS'2 : take N1 EE4 [[(L, V2)]] NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Take: case NNS'2. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR N1 SNames BNames N2 L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'1 : drop N1 ([(L, V2)]::L1) BR NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L1 [] ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Take1. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR N1 SNames BNames L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'1 : drop N1 ([(L, V2)]::L1) BR NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< compute Take. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'1 : drop 1 ([(L, V2)]::L1) BR NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Drop: case NNS'1. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 N3 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 BR ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply drop_is_integer to Drop1. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 N3 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L1 BR H6 : is_integer N3 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 BR H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Eq: assert L1 = BR. Subgoal 1.8.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 BR H6 : is_integer 0 ============================ L1 = BR
< D: case Drop1. Subgoal 1.8.1.1.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 ============================ BR = BR
< search. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 BR ============================ X1::L2 = BR
< apply drop_is_integer to D1. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 BR H7 : is_integer N4 ============================ X1::L2 = BR
< P: assert 1 + -1 = 0. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N4 = 0 D1 : drop N4 L2 BR H7 : is_integer N4 P : 1 + -1 = 0 ============================ X1::L2 = BR
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 BR H7 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L2 = BR
< GEq: apply drop_geq_0 to D1. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 BR H7 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X1::L2 = BR
< LEq: case GEq. Subgoal 1.8.1.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 BR H7 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L2 = BR
< case LEq. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 BR H6 : is_integer 0 Eq : L1 = BR ============================ iterateList FE EE (recVal Fields) X Body EE' O
< case Eq. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 BR BR H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< clear Take Drop Drop1. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< CN': apply evalStmt_ctx_names to _ _ _ _ _ BN EvB. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 CN' : ctx_names (Scope::BR) Ctx' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply stmtNames_keep_older to _ _ BN. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 CN' : ctx_names (Scope::BR) (Scope'1::Ctx) H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< CN': case CN'. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx ============================ iterateList FE EE (recVal Fields) X Body EE' O
< IsBR+: apply evalStmt_isCtx to _ _ _ EvB. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx IsBR+ : is_list (is_list (is_pair is_string is_value)) (Scope::BR) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< IsBR: case IsBR+. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx IsBR : is_list (is_pair is_string is_value) Scope IsBR1 : is_list (is_list (is_pair is_string is_value)) BR ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NamesBR: apply names_exists to IsBR1. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx IsBR : is_list (is_pair is_string is_value) Scope IsBR1 : is_list (is_list (is_pair is_string is_value)) BR NamesBR : names BR N4 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< IsN4: apply names_is to _ NamesBR. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx IsBR : is_list (is_pair is_string is_value) Scope IsBR1 : is_list (is_list (is_pair is_string is_value)) BR NamesBR : names BR N4 IsN4 : is_list is_string N4 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< Fr': apply fresh_name_exists to _ _ with Base = "L" Names = X::N4. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4 F IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12 NNS' : length BR N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names BR BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope CN'2 : ctx_names BR Ctx IsBR : is_list (is_pair is_string is_value) Scope IsBR1 : is_list (is_list (is_pair is_string is_value)) BR NamesBR : names BR N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NS: apply evalStmt_names_same to _ _ _ EvB. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply fresh_name_unique_mems to Fr Fr' _ _. Subgoal 1.8.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ forall X1, mem X1 (X::N4) -> mem X1 (X::Names)
< intros M. Subgoal 1.8.1.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 (X::N4) ============================ mem X1 (X::Names)
< M: case M. Subgoal 1.8.1.2.1: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ mem X (X::Names)
< search. Subgoal 1.8.1.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 ============================ mem X1 (X::Names)
< NS': apply names_same_symmetric to NS. Subgoal 1.8.1.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 NS' : names_same EE'' EE ============================ mem X1 (X::Names)
< apply names_same_names to NS' NamesBR Names M. Subgoal 1.8.1.2.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 NS' : names_same EE'' EE H8 : mem X1 Names ============================ mem X1 (X::Names)
< search. Subgoal 1.8.1.3: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ forall X1, mem X1 (X::Names) -> mem X1 (X::N4)
< intros M. Subgoal 1.8.1.3: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 (X::Names) ============================ mem X1 (X::N4)
< M: case M. Subgoal 1.8.1.3.1: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ mem X (X::N4)
< search. Subgoal 1.8.1.3.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 Names ============================ mem X1 (X::N4)
< apply names_same_names to NS Names NamesBR M. Subgoal 1.8.1.3.2: Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(L, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 Names H8 : mem X1 N4 ============================ mem X1 (X::N4)
< search. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) F CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(F, V2)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes F ([(F, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes F ([]::([(F, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(F, V2)]::EE)) Body (Scope'2::([(F, V2)]::EE'')) O12 * Ev9 : replaceScopes F V2 ([(X, V1)]::([(F, recVal Fields)]::EE)) ([(X, V1)]::([(F, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes F ([(X, V1)]::([(F, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(F, V2)]] N ([(F, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string F IsR1 : is_string F H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(F, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply IH to _ _ _ _ _ _ NamesBR Fr' CN'2 BN Ev2. Subgoal 1.8.1: Variables: FE EE X Body Scope' EE' O Names Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) F CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx) Ev2 : evalStmt FE ([(F, V2)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes F ([(F, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes F ([]::([(F, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(F, V2)]::EE)) Body (Scope'2::([(F, V2)]::EE'')) O12 * Ev9 : replaceScopes F V2 ([(X, V1)]::([(F, recVal Fields)]::EE)) ([(X, V1)]::([(F, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes F ([(X, V1)]::([(F, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(F, V2)]] N ([(F, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string F IsR1 : is_string F H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12 NNS' : length EE'' N NNS'3 : names [[(F, V2)]] SNames NNS'4 : names EE'' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : forall X1, mem X1 [X] -> mem X1 Scope'1 CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1 CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2 CN'2 : ctx_names EE'' Ctx IsBR : is_list (is_pair is_string is_value) Scope'2 IsBR1 : is_list (is_list (is_pair is_string is_value)) EE'' NamesBR : names EE'' N4 IsN4 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' H8 : iterateList FE EE'' V2 X Body EE' O4 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< search. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR1 S AR IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 ============================ iterateList FE EE (recVal Fields) X Body EE' O
< NS: apply evalStmt_names_same to _ _ _ EvB. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) ============================ iterateList FE EE (recVal Fields) X Body EE' O
< LenBR+: apply names_same_length to NS Len. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) LenBR+ : length (S::BR1) N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< LenBR: case LenBR+. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) LenBR : length BR1 N' LenBR1 : 1 + N' = N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply length_is to LenBR. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) LenBR : length BR1 N' LenBR1 : 1 + N' = N H6 : is_integer N' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) LenBR : length BR1 N' LenBR1 : 1 + N' = N H6 : is_integer N' LEq : N <= N' ============================ iterateList FE EE (recVal Fields) X Body EE' O
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.8.2: Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 * Ev4 : O12 ++ O4 = O Ev5 : lookup Fields "null" falseVal Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields) Ev7 : lookup Fields "head" V1 Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields) Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 * Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE)) Ev10 : lookup Fields "tail" V2 Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields) Len : length EE N NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx) H2 : is_string L IsR1 : is_string L H3 : is_list (is_pair is_string is_value) Fields H4 : is_value V1 H5 : is_value V2 EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12 NNS' : newNameScopes [[(L, V2)]] N AR BR1 NS : names_same EE (S::BR1) LenBR : length BR1 N' LenBR1 : 1 + N' = N H6 : is_integer N' LEq : N <= N' L : N' < N ============================ iterateList FE EE (recVal Fields) X Body EE' O
< apply less_lesseq_flip_false to L LEq. Subgoal 2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev : evalExpr FE ([(L, V)]::EE) (not (null (name L))) falseVal (Scope'::EE') O * ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev : evalExpr FE ([(L, V)]::EE) (null (name L)) trueVal (Scope'::EE') O * ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 2: Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Names : names EE Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev : evalExpr FE ([(L, V)]::EE) (name L) (recVal Fields) (Scope'::EE') O * Ev1 : lookup Fields "null" trueVal ============================ iterateList FE EE V X Body EE' O
< Ev: case Ev. Subgoal 2: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields) ============================ iterateList FE EE' V X Body EE' []
< Eq: assert V = recVal Fields. Subgoal 2.1: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields) ============================ V = recVal Fields
< LS: case Ev. Subgoal 2.1.1: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal LS : lookup [(L, V)] L (recVal Fields) ============================ V = recVal Fields
< L: case LS. Subgoal 2.1.1.1: Variables: FE X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal ============================ recVal Fields = recVal Fields
< search. Subgoal 2.1.1.2: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal L : L = L -> false L1 : lookup [] L (recVal Fields) ============================ V = recVal Fields
< apply L to _. Subgoal 2.1.2: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal LS : no_lookup [(L, V)] L LS1 : lookupScopes L EE' (recVal Fields) ============================ V = recVal Fields
< NL: case LS. Subgoal 2.1.2: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal LS1 : lookupScopes L EE' (recVal Fields) NL : L = L -> false NL1 : no_lookup [] L ============================ V = recVal Fields
< apply NL to _. Subgoal 2: Variables: FE V X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value V IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields) Eq : V = recVal Fields ============================ iterateList FE EE' V X Body EE' []
< case Eq. Subgoal 2: Variables: FE X Body EE' Names L Ctx Ctx' Fields IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx', is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' -> evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * -> iterateList FE EE V X Body EE' O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Names : names EE' Names Fr : fresh_name "L" (X::Names) L CN : ctx_names EE' Ctx BN : stmtNames ([X]::Ctx) Body [] Ctx' Ev1 : lookup Fields "null" trueVal Ev : lookupScopes L ([(L, recVal Fields)]::EE') (recVal Fields) ============================ iterateList FE EE' (recVal Fields) X Body EE' []
< search. Proof completed.
< Theorem lookupScopes_replaceScopes_exists : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V -> exists R, replaceScopes Key V' L R. ============================ forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V -> exists R, replaceScopes Key V' L R
< induction on 3. IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R ============================ forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V @ -> exists R, replaceScopes Key V' L R
< intros IsL IsKey LS. Variables: L Key V V' IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsL : is_list (is_list (is_pair is_string is_value)) L IsKey : is_string Key LS : lookupScopes Key L V @ ============================ exists R, replaceScopes Key V' L R
< LS: case LS. Subgoal 1: Variables: Key V V' Rest L1 IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsKey : is_string Key LS : lookup L1 Key V ============================ exists R, replaceScopes Key V' (L1::Rest) R
< Is: case IsL. Subgoal 1: Variables: Key V V' Rest L1 IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsKey : is_string Key LS : lookup L1 Key V Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists R, replaceScopes Key V' (L1::Rest) R
< RA: apply remove_all_exists to Is IsKey. Subgoal 1: Variables: Key V V' Rest L1 EE' IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsKey : is_string Key LS : lookup L1 Key V Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest RA : remove_all L1 Key EE' ============================ exists R, replaceScopes Key V' (L1::Rest) R
< M: apply lookup_mem to LS. Subgoal 1: Variables: Key V V' Rest L1 EE' IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsKey : is_string Key LS : lookup L1 Key V Is : is_list (is_pair is_string is_value) L1 Is1 : is_list (is_list (is_pair is_string is_value)) Rest RA : remove_all L1 Key EE' M : mem (Key, V) L1 ============================ exists R, replaceScopes Key V' (L1::Rest) R
< search. Subgoal 2: Variables: Key V V' Rest L1 IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest) IsKey : is_string Key LS : no_lookup L1 Key LS1 : lookupScopes Key Rest V * ============================ exists R, replaceScopes Key V' (L1::Rest) R
< case IsL. Subgoal 2: Variables: Key V V' Rest L1 IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsKey : is_string Key LS : no_lookup L1 Key LS1 : lookupScopes Key Rest V * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists R, replaceScopes Key V' (L1::Rest) R
< apply IH to _ _ LS1 with V' = V'. Subgoal 2: Variables: Key V V' Rest L1 R IH : forall L Key V V', is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * -> exists R, replaceScopes Key V' L R IsKey : is_string Key LS : no_lookup L1 Key LS1 : lookupScopes Key Rest V * H1 : is_list (is_pair is_string is_value) L1 H2 : is_list (is_list (is_pair is_string is_value)) Rest H3 : replaceScopes Key V' Rest R ============================ exists R, replaceScopes Key V' (L1::Rest) R
< search. Proof completed.
< Theorem replaceScopes_lookupScopes_same [Key, Item] : forall L (Key : Key) (V : Item) R, replaceScopes Key V L R -> lookupScopes Key R V. ============================ forall L Key V R, replaceScopes Key V L R -> lookupScopes Key R V
< induction on 1. IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V ============================ forall L Key V R, replaceScopes Key V L R @ -> lookupScopes Key R V
< intros RS. Variables: L Key V R IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V RS : replaceScopes Key V L R @ ============================ lookupScopes Key R V
< RS: case RS. Subgoal 1: Variables: Key V I Rest LRemain L1 IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V RS : mem (Key, I) L1 RS1 : remove_all L1 Key LRemain ============================ lookupScopes Key (((Key, V)::LRemain)::Rest) V
< search. Subgoal 2: Variables: Key V New L1 Rest IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V RS : no_lookup L1 Key RS1 : replaceScopes Key V Rest New * ============================ lookupScopes Key (L1::New) V
< apply IH to RS1. Subgoal 2: Variables: Key V New L1 Rest IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V RS : no_lookup L1 Key RS1 : replaceScopes Key V Rest New * H1 : lookupScopes Key New V ============================ lookupScopes Key (L1::New) V
< search. Proof completed.
< Theorem remove_all_twice [K, V] : forall (L : list (pair K V)) K RA RB, remove_all L K RA -> remove_all RA K RB -> RA = RB. ============================ forall L K RA RB, remove_all L K RA -> remove_all RA K RB -> RA = RB
< induction on 1. IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB ============================ forall L K RA RB, remove_all L K RA @ -> remove_all RA K RB -> RA = RB
< intros RA RB. Variables: L K RA RB IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RA : remove_all L K RA @ RB : remove_all RA K RB ============================ RA = RB
< RA: case RA. Subgoal 1: Variables: K RB IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RB : remove_all [] K RB ============================ [] = RB
< case RB. Subgoal 1: Variables: K IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB ============================ [] = []
< search. Subgoal 2: Variables: K RA RB Rest Item IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RB : remove_all RA K RB RA : remove_all Rest K RA * ============================ RA = RB
< apply IH to RA RB. Subgoal 2: Variables: K RB Rest Item IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RB : remove_all RB K RB RA : remove_all Rest K RB * ============================ RB = RB
< search. Subgoal 3: Variables: K RB R Item K1 Rest IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RB : remove_all ((K1, Item)::R) K RB RA : K1 = K -> false RA1 : remove_all Rest K R * ============================ (K1, Item)::R = RB
< RB: case RB. Subgoal 3.1: Variables: K RB R Item Rest IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RA : K = K -> false RA1 : remove_all Rest K R * RB : remove_all R K RB ============================ (K, Item)::R = RB
< apply RA to _. Subgoal 3.2: Variables: K R Item K1 Rest R1 IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RA : K1 = K -> false RA1 : remove_all Rest K R * RB : K1 = K -> false RB1 : remove_all R K R1 ============================ (K1, Item)::R = (K1, Item)::R1
< apply IH to RA1 RB1. Subgoal 3.2: Variables: K Item K1 Rest R1 IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB RA : K1 = K -> false RA1 : remove_all Rest K R1 * RB : K1 = K -> false RB1 : remove_all R1 K R1 ============================ (K1, Item)::R1 = (K1, Item)::R1
< search. Proof completed.
< Theorem replaceScopes_twice [Key, Item] : forall (L : list (list (pair (string) value))) K VA RA VB RB, replaceScopes K VA L RA -> replaceScopes K VB RA RB -> replaceScopes K VB L RB. ============================ forall L K VA RA VB RB, replaceScopes K VA L RA -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
< induction on 1. IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB ============================ forall L K VA RA VB RB, replaceScopes K VA L RA @ -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
< intros RSA RSB. Variables: L K VA RA VB RB IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : replaceScopes K VA L RA @ RSB : replaceScopes K VB RA RB ============================ replaceScopes K VB L RB
< RSA: case RSA. Subgoal 1: Variables: K VA VB RB I Rest LRemain L1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSB : replaceScopes K VB (((K, VA)::LRemain)::Rest) RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain ============================ replaceScopes K VB (L1::Rest) RB
< RSB: case RSB. Subgoal 1.1: Variables: K VA VB I Rest LRemain L1 I1 LRemain1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain RSB : mem (K, I1) ((K, VA)::LRemain) RSB1 : remove_all ((K, VA)::LRemain) K LRemain1 ============================ replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
< RA: case RSB1. Subgoal 1.1.1: Variables: K VA VB I Rest LRemain L1 I1 LRemain1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain RSB : mem (K, I1) ((K, VA)::LRemain) RA : remove_all LRemain K LRemain1 ============================ replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
< apply remove_all_twice to RSA1 RA. Subgoal 1.1.1: Variables: K VA VB I Rest L1 I1 LRemain1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain1 RSB : mem (K, I1) ((K, VA)::LRemain1) RA : remove_all LRemain1 K LRemain1 ============================ replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
< search. Subgoal 1.1.2: Variables: K VA VB I Rest LRemain L1 I1 R IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain RSB : mem (K, I1) ((K, VA)::LRemain) RA : K = K -> false RA1 : remove_all LRemain K R ============================ replaceScopes K VB (L1::Rest) (((K, VB)::((K, VA)::R))::Rest)
< apply RA to _. Subgoal 1.2: Variables: K VA VB I Rest LRemain L1 New IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain RSB : no_lookup ((K, VA)::LRemain) K RSB1 : replaceScopes K VB Rest New ============================ replaceScopes K VB (L1::Rest) (((K, VA)::LRemain)::New)
< N: case RSB. Subgoal 1.2: Variables: K VA VB I Rest LRemain L1 New IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : mem (K, I) L1 RSA1 : remove_all L1 K LRemain RSB1 : replaceScopes K VB Rest New N : K = K -> false N1 : no_lookup LRemain K ============================ replaceScopes K VB (L1::Rest) (((K, VA)::LRemain)::New)
< apply N to _. Subgoal 2: Variables: K VA VB RB New L1 Rest IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSB : replaceScopes K VB (L1::New) RB RSA : no_lookup L1 K RSA1 : replaceScopes K VA Rest New * ============================ replaceScopes K VB (L1::Rest) RB
< RSB: case RSB. Subgoal 2.1: Variables: K VA VB New L1 Rest I LRemain IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : no_lookup L1 K RSA1 : replaceScopes K VA Rest New * RSB : mem (K, I) L1 RSB1 : remove_all L1 K LRemain ============================ replaceScopes K VB (L1::Rest) (((K, VB)::LRemain)::New)
< apply no_lookup_mem to RSA RSB. Subgoal 2.2: Variables: K VA VB New L1 Rest New1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : no_lookup L1 K RSA1 : replaceScopes K VA Rest New * RSB : no_lookup L1 K RSB1 : replaceScopes K VB New New1 ============================ replaceScopes K VB (L1::Rest) (L1::New1)
< apply IH to RSA1 RSB1. Subgoal 2.2: Variables: K VA VB New L1 Rest New1 IH : forall L K VA RA VB RB, replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB RSA : no_lookup L1 K RSA1 : replaceScopes K VA Rest New * RSB : no_lookup L1 K RSB1 : replaceScopes K VB New New1 H1 : replaceScopes K VB Rest New1 ============================ replaceScopes K VB (L1::Rest) (L1::New1)
< search. Proof completed.
< Theorem updateListIndex_is_integer : forall L I V L', updateListIndex L I V L' -> is_integer I. ============================ forall L I V L', updateListIndex L I V L' -> is_integer I
< induction on 1. IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ============================ forall L I V L', updateListIndex L I V L' @ -> is_integer I
< intros ULI. Variables: L I V L' IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ULI : updateListIndex L I V L' @ ============================ is_integer I
< ULI: case ULI. Subgoal 1: Variables: V NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ is_integer 0
< search. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ is_integer I
< IsI1: apply IH to ULI3. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields IsI1 : is_integer I1 ============================ is_integer I
< apply minus_integer_is_integer_result to _ ULI1. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields IsI1 : is_integer I1 H1 : is_integer I H2 : is_integer 1 ============================ is_integer I
< search. Proof completed.
< Theorem updateListIndex_pos : forall L I V L', updateListIndex L I V L' -> I >= 0. ============================ forall L I V L', updateListIndex L I V L' -> I >= 0
< induction on 1. IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 ============================ forall L I V L', updateListIndex L I V L' @ -> I >= 0
< intros ULI. Variables: L I V L' IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 ULI : updateListIndex L I V L' @ ============================ I >= 0
< IsI: apply updateListIndex_is_integer to ULI. Variables: L I V L' IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 ULI : updateListIndex L I V L' @ IsI : is_integer I ============================ I >= 0
< ULI: case ULI. Subgoal 1: Variables: V NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer 0 ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ 0 >= 0
< search. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ I >= 0
< GEq: apply IH to ULI3. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEq : I1 >= 0 ============================ I >= 0
< P: apply minus_plus_same_integer to _ _ ULI1. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEq : I1 >= 0 P : I1 + 1 = I ============================ I >= 0
< IsI1: apply updateListIndex_is_integer to ULI3. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEq : I1 >= 0 P : I1 + 1 = I IsI1 : is_integer I1 ============================ I >= 0
< P': apply plus_integer_comm to _ _ P. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEq : I1 >= 0 P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I ============================ I >= 0
< L: apply lt_plus_one to P' _. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEq : I1 >= 0 P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I L : I1 < I ============================ I >= 0
< LEq: case GEq. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I L : I1 < I LEq : 0 <= I1 ============================ I >= 0
< L': apply lesseq_less_integer_transitive to LEq L. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I L : I1 < I LEq : 0 <= I1 L' : 0 < I ============================ I >= 0
< G: assert I > 0. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I L : I1 < I LEq : 0 <= I1 L' : 0 < I G : I > 0 ============================ I >= 0
< apply greater_integer_greatereq to G. Subgoal 2: Variables: I V I1 Tl TlNew NewFields Fields IH : forall L I V L', updateListIndex L I V L' * -> I >= 0 IsI : is_integer I ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields P : I1 + 1 = I IsI1 : is_integer I1 P' : 1 + I1 = I L : I1 < I LEq : 0 <= I1 L' : 0 < I G : I > 0 H1 : I >= 0 ============================ I >= 0
< search. Proof completed.
< Define listy : value -> prop by listy (recVal Fields) := lookup Fields "null" trueVal; listy (recVal Fields) := exists Tl, (lookup Fields "null" falseVal /\ lookup Fields "tail" Tl) /\ listy Tl.
< Define flipOnto : value -> value -> value -> prop by flipOnto (recVal Fields) L L := lookup Fields "null" trueVal; flipOnto (recVal Fields) L L' := exists Fields' T, ((lookup Fields "null" falseVal /\ lookup Fields "tail" T) /\ replaceRecVal "tail" L Fields Fields') /\ flipOnto T (recVal Fields') L'.
< Theorem lookup_replaceRecVal_exists : forall L F V V', lookup L F V -> exists R, replaceRecVal F V' L R. ============================ forall L F V V', lookup L F V -> exists R, replaceRecVal F V' L R
< induction on 1. IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R ============================ forall L F V V', lookup L F V @ -> exists R, replaceRecVal F V' L R
< intros L. Variables: L F V V' IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : lookup L F V @ ============================ exists R, replaceRecVal F V' L R
< L: case L. Subgoal 1: Variables: F V V' Rest IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R ============================ exists R, replaceRecVal F V' ((F, V)::Rest) R
< search. Subgoal 2: Variables: F V V' Rest V1 K IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = F -> false L1 : lookup Rest F V * ============================ exists R, replaceRecVal F V' ((K, V1)::Rest) R
< assert F = K -> false. Subgoal 2.1: Variables: F V V' Rest V1 K IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = F -> false L1 : lookup Rest F V * ============================ F = K -> false
< intros E. Subgoal 2.1: Variables: F V V' Rest V1 K IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = F -> false L1 : lookup Rest F V * E : F = K ============================ false
< case E. Subgoal 2.1: Variables: V V' Rest V1 K IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = K -> false L1 : lookup Rest K V * ============================ false
< backchain L. Subgoal 2: Variables: F V V' Rest V1 K IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = F -> false L1 : lookup Rest F V * H1 : F = K -> false ============================ exists R, replaceRecVal F V' ((K, V1)::Rest) R
< apply IH to L1 with V' = V'. Subgoal 2: Variables: F V V' Rest V1 K R IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R L : K = F -> false L1 : lookup Rest F V * H1 : F = K -> false H2 : replaceRecVal F V' Rest R ============================ exists R, replaceRecVal F V' ((K, V1)::Rest) R
< search. Proof completed.
< Theorem replaceScopes_lookupScopes [Key, Item] : forall (X : Key) (V : Item) L R, replaceScopes X V L R -> lookupScopes X R V. ============================ forall X V L R, replaceScopes X V L R -> lookupScopes X R V
< induction on 1. IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V ============================ forall X V L R, replaceScopes X V L R @ -> lookupScopes X R V
< intros RS. Variables: X V L R IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V RS : replaceScopes X V L R @ ============================ lookupScopes X R V
< RS: case RS. Subgoal 1: Variables: X V I Rest LRemain L1 IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain ============================ lookupScopes X (((X, V)::LRemain)::Rest) V
< search. Subgoal 2: Variables: X V New L1 Rest IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * ============================ lookupScopes X (L1::New) V
< apply IH to RS1. Subgoal 2: Variables: X V New L1 Rest IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V RS : no_lookup L1 X RS1 : replaceScopes X V Rest New * H1 : lookupScopes X New V ============================ lookupScopes X (L1::New) V
< search. Proof completed.
< Theorem replaceRecVal_lookup : forall L F V R, replaceRecVal F V L R -> lookup R F V. ============================ forall L F V R, replaceRecVal F V L R -> lookup R F V
< induction on 1. IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V ============================ forall L F V R, replaceRecVal F V L R @ -> lookup R F V
< intros R. Variables: L F V R IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : replaceRecVal F V L R @ ============================ lookup R F V
< R: case R. Subgoal 1: Variables: F V Rest VOld IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V ============================ lookup ((F, V)::Rest) F V
< search. Subgoal 2: Variables: F V RRest VO O Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = O -> false R1 : replaceRecVal F V Rest RRest * ============================ lookup ((O, VO)::RRest) F V
< assert O = F -> false. Subgoal 2.1: Variables: F V RRest VO O Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = O -> false R1 : replaceRecVal F V Rest RRest * ============================ O = F -> false
< intros E. Subgoal 2.1: Variables: F V RRest VO O Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = O -> false R1 : replaceRecVal F V Rest RRest * E : O = F ============================ false
< case E. Subgoal 2.1: Variables: F V RRest VO Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = F -> false R1 : replaceRecVal F V Rest RRest * ============================ false
< backchain R. Subgoal 2: Variables: F V RRest VO O Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = O -> false R1 : replaceRecVal F V Rest RRest * H1 : O = F -> false ============================ lookup ((O, VO)::RRest) F V
< apply IH to R1. Subgoal 2: Variables: F V RRest VO O Rest IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V R : F = O -> false R1 : replaceRecVal F V Rest RRest * H1 : O = F -> false H2 : lookup RRest F V ============================ lookup ((O, VO)::RRest) F V
< search. Proof completed.
< Theorem replaceRecVal_lookup_other : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' -> (F = F' -> false) -> lookup R F' V'. ============================ forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' -> (F = F' -> false) -> lookup R F' V'
< induction on 2. IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' ============================ forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' @ -> (F = F' -> false) -> lookup R F' V'
< intros RRV L NEq. Variables: L F V R F' V' IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' RRV : replaceRecVal F V L R L : lookup L F' V' @ NEq : F = F' -> false ============================ lookup R F' V'
< L: case L. Subgoal 1: Variables: F V R F' V' Rest IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' RRV : replaceRecVal F V ((F', V')::Rest) R NEq : F = F' -> false ============================ lookup R F' V'
< RRV: case RRV. Subgoal 1.1: Variables: V F' V' Rest IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' NEq : F' = F' -> false ============================ lookup ((F', V)::Rest) F' V'
< apply NEq to _. Subgoal 1.2: Variables: F V F' V' Rest RRest IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' NEq : F = F' -> false RRV : F = F' -> false RRV1 : replaceRecVal F V Rest RRest ============================ lookup ((F', V')::RRest) F' V'
< search. Subgoal 2: Variables: F V R F' V' Rest V1 K IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' RRV : replaceRecVal F V ((K, V1)::Rest) R NEq : F = F' -> false L : K = F' -> false L1 : lookup Rest F' V' * ============================ lookup R F' V'
< RRV: case RRV. Subgoal 2.1: Variables: V F' V' Rest V1 K IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' NEq : K = F' -> false L : K = F' -> false L1 : lookup Rest F' V' * ============================ lookup ((K, V)::Rest) F' V'
< search. Subgoal 2.2: Variables: F V F' V' Rest V1 K RRest IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' NEq : F = F' -> false L : K = F' -> false L1 : lookup Rest F' V' * RRV : F = K -> false RRV1 : replaceRecVal F V Rest RRest ============================ lookup ((K, V1)::RRest) F' V'
< apply IH to RRV1 L1 _. Subgoal 2.2: Variables: F V F' V' Rest V1 K RRest IH : forall L F V R F' V', replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V' NEq : F = F' -> false L : K = F' -> false L1 : lookup Rest F' V' * RRV : F = K -> false RRV1 : replaceRecVal F V Rest RRest H1 : lookup RRest F' V' ============================ lookup ((K, V1)::RRest) F' V'
< search. Proof completed.
< Theorem replaceRecVal_twice : forall A B C F V1 V2, replaceRecVal F V1 A B -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C. ============================ forall A B C F V1 V2, replaceRecVal F V1 A B -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
< induction on 1. IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C ============================ forall A B C F V1 V2, replaceRecVal F V1 A B @ -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
< intros RAB RBC. Variables: A B C F V1 V2 IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RAB : replaceRecVal F V1 A B @ RBC : replaceRecVal F V2 B C ============================ replaceRecVal F V2 A C
< RAB: case RAB. Subgoal 1: Variables: C F V1 V2 Rest VOld IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RBC : replaceRecVal F V2 ((F, V1)::Rest) C ============================ replaceRecVal F V2 ((F, VOld)::Rest) C
< RBC: case RBC. Subgoal 1.1: Variables: F V1 V2 Rest VOld IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C ============================ replaceRecVal F V2 ((F, VOld)::Rest) ((F, V2)::Rest)
< search. Subgoal 1.2: Variables: F V1 V2 Rest VOld RRest IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RBC : F = F -> false RBC1 : replaceRecVal F V2 Rest RRest ============================ replaceRecVal F V2 ((F, VOld)::Rest) ((F, V1)::RRest)
< apply RBC to _. Subgoal 2: Variables: C F V1 V2 RRest VO O Rest IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RBC : replaceRecVal F V2 ((O, VO)::RRest) C RAB : F = O -> false RAB1 : replaceRecVal F V1 Rest RRest * ============================ replaceRecVal F V2 ((O, VO)::Rest) C
< RBC: case RBC. Subgoal 2.1: Variables: V1 V2 RRest VO O Rest IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RAB : O = O -> false RAB1 : replaceRecVal O V1 Rest RRest * ============================ replaceRecVal O V2 ((O, VO)::Rest) ((O, V2)::RRest)
< apply RAB to _. Subgoal 2.2: Variables: F V1 V2 RRest VO O Rest RRest1 IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RAB : F = O -> false RAB1 : replaceRecVal F V1 Rest RRest * RBC : F = O -> false RBC1 : replaceRecVal F V2 RRest RRest1 ============================ replaceRecVal F V2 ((O, VO)::Rest) ((O, VO)::RRest1)
< apply IH to RAB1 RBC1. Subgoal 2.2: Variables: F V1 V2 RRest VO O Rest RRest1 IH : forall A B C F V1 V2, replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C RAB : F = O -> false RAB1 : replaceRecVal F V1 Rest RRest * RBC : F = O -> false RBC1 : replaceRecVal F V2 RRest RRest1 H1 : replaceRecVal F V2 Rest RRest1 ============================ replaceRecVal F V2 ((O, VO)::Rest) ((O, VO)::RRest1)
< search. Proof completed.
< Theorem eval_update_loop2 : forall (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) V HFs HoldL LVal G FE, listy HoldL -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV. ============================ forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< induction on 1. IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV ============================ forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< intros ListyH IsFE IsCtx LkpTl LkpNl NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC LS. Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV ListyH : listy HoldL @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" HoldL LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< NamesCtx: apply names_exists to IsCtx. Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV ListyH : listy HoldL @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" HoldL LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) N ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< rename N to Names. Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE Names IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV ListyH : listy HoldL @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" HoldL LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< ListyH: case ListyH. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal ============================ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
< unfold . Subgoal 1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal ============================ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (null (name Hold)) falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
< unfold . Subgoal 1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal ============================ exists Names E_P V_P EE_P O_P Fields, (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal Fields) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\ lookup Fields "null" falseVal) /\ (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\ (Names |{expr}- null (name Hold) ~~> E_P /\ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) E_P V_P EE_P O_P))
< exists Names, recFieldAccess (name Hold) "null", falseVal, []::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G), [], HFs. Subgoal 1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal ============================ (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal HFs) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\ lookup HFs "null" falseVal) /\ (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\ (Names |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recFieldAccess (name Hold) "null") falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []))
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody1: assert <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< RRVCopy: apply lookup_replaceRecVal_exists to LkpTl with V' = LVal. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody2: assert <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply lookupScopes_is to _ LS. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< RS: apply lookupScopes_replaceScopes_exists to _ _ LS with V' = recVal R. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody3: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Eq: assert exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'. Subgoal 1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] ============================ exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< RS: case RS. Subgoal 1.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS : mem (L, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case RS. Subgoal 1.2.1.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string Hold EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::(((Hold, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold LRemain ============================ exists R', ((Hold, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqHL to _. Subgoal 1.2.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case M. Subgoal 1.2.1.2.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes SaveI ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveI)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string SaveI EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (name Copy)) ([(Copy, recVal R)]::(((SaveI, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain ============================ exists R', ((SaveI, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqIL to _. Subgoal 1.2.1.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveE, V)] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case M. Subgoal 1.2.1.2.2.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes SaveE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveE)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string SaveE EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (name Copy)) ([(Copy, recVal R)]::(((SaveE, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain ============================ exists R', ((SaveE, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqEL to _. Subgoal 1.2.1.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< case M. Subgoal 1.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R New IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New)) [] RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal R) G New ============================ exists R', [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] Eq : exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R' ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case IsCtx. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case Is. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal HFs) Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case Is. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold Is3 : is_value (recVal HFs) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Is3. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply replaceRecVal_is to _ _ RRVCopy. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is+: apply replaceScopes_is to _ _ RS. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply names_exists to Is+. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody4: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []. Subgoal 1.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
< unfold . Subgoal 1.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists V1 EE1, <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) V1 EE1 [] /\ replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< exists recVal Fields, [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'). Subgoal 1.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< split. Subgoal 1.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< unfold . Subgoal 1.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists Names E_P V_P EE_P O_P Fields1, (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal Fields1) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ lookup Fields1 "tail" (recVal Fields)) /\ (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) Names /\ (Names |{expr}- tail (name Hold) ~~> E_P /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) E_P V_P EE_P O_P))
< exists Copy::N, recFieldAccess (name Hold) "tail", recVal Fields, [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'), [], HFs. Subgoal 1.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ lookup HFs "tail" (recVal Fields)) /\ (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N) /\ ((Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail" /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []))
< split. Subgoal 1.3.1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< search. Subgoal 1.3.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ lookup HFs "tail" (recVal Fields)
< search. Subgoal 1.3.1.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N)
< search. Subgoal 1.3.1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ (Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail"
< search. Subgoal 1.3.1.5: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< search. Subgoal 1.3.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< unfold . Subgoal 1.3.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ no_lookup [(Copy, recVal R)] Hold
< search. Subgoal 1.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ replaceScopes Hold (recVal Fields) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')
< unfold . Subgoal 1.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists I, mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< exists recVal HFs. Subgoal 1.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< split. Subgoal 1.3.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
< search. Subgoal 1.3.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< unfold . Subgoal 1.3.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< unfold . Subgoal 1.3.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ SaveI = Hold -> false
< intros E. Subgoal 1.3.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N E : SaveI = Hold ============================ false
< case E. Subgoal 1.3.2.2.2.1: Variables: Hold SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(Hold, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') N ============================ false
< backchain NEqHI. Subgoal 1.3.2.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(SaveE, V)] Hold [(SaveE, V)]
< unfold . Subgoal 1.3.2.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ SaveE = Hold -> false
< intros E. Subgoal 1.3.2.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N E : SaveE = Hold ============================ false
< case E. Subgoal 1.3.2.2.2.2.1: Variables: Hold SaveI Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Hold -> false NEqIL : SaveI = L -> false NEqHE : Hold = Hold -> false NEqEL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : Hold = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (Hold, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') N ============================ false
< backchain NEqHE. Subgoal 1.3.2.2.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [] Hold []
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< IsV: apply lookup_is_value to _ LkpTl. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] IsV : is_value (recVal Fields) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case IsV. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Is+. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply names_exists to _ with L = [(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvCond2: assert <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []. Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
< unfold . Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (null (name Hold)) trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
< unfold . Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ exists Names E_P V_P EE_P O_P Fields1, (<evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields1) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\ lookup Fields1 "null" trueVal) /\ (names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') Names /\ (Names |{expr}- null (name Hold) ~~> E_P /\ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') E_P V_P EE_P O_P))
< exists N1, recFieldAccess (name Hold) "null", trueVal, [(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R', [], Fields. Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ (<evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\ lookup Fields "null" trueVal) /\ (names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 /\ (N1 |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recFieldAccess (name Hold) "null") trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []))
< split. Subgoal 1.4.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
< search. Subgoal 1.4.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ lookup Fields "null" trueVal
< search. Subgoal 1.4.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
< search. Subgoal 1.4.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ N1 |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null"
< search. Subgoal 1.4.5: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 ============================ <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recFieldAccess (name Hold) "null") trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< exists R', recVal R, Fields. Subgoal 1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\ lookup Fields "null" trueVal) /\ replaceScopes L (recVal R) G R') /\ flipOnto (recVal HFs) LVal (recVal R)
< split. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ <evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
< search 7. Subgoal 1.6: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ lookup Fields "null" trueVal
< search. Subgoal 1.7: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ replaceScopes L (recVal R) G R'
< RS: case RS. Subgoal 1.7.1: Variables: Hold SaveI SaveE Copy V HFs LVal FE Names Fields R' N N1 I IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] RRVCopy : replaceRecVal "tail" LVal HFs HFs EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] H1 : is_value LVal H2 : is_string Hold EvBody3 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (name Copy)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) R' Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) HFs H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal HFs)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] RS : mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)] ============================ replaceScopes Hold (recVal HFs) R' R'
< apply NEqHL to _. Subgoal 1.7.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal R) G R' ============================ replaceScopes L (recVal R) G R'
< search. Subgoal 1.8: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" trueVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] ============================ flipOnto (recVal HFs) LVal (recVal R)
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * ============================ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
< unfold . Subgoal 2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * ============================ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (null (name Hold)) falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
< unfold . Subgoal 2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * ============================ exists Names E_P V_P EE_P O_P Fields, (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal Fields) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\ lookup Fields "null" falseVal) /\ (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\ (Names |{expr}- null (name Hold) ~~> E_P /\ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) E_P V_P EE_P O_P))
< exists Names, recFieldAccess (name Hold) "null", falseVal, []::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G), [], HFs. Subgoal 2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * ============================ (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal HFs) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\ lookup HFs "null" falseVal) /\ (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\ (Names |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\ <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recFieldAccess (name Hold) "null") falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []))
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody1: assert <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< RRVCopy: apply lookup_replaceRecVal_exists to LkpTl with V' = LVal. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody2: assert <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply lookupScopes_is to _ LS. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< RS: apply lookupScopes_replaceScopes_exists to _ _ LS with V' = recVal R. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody3: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Eq: assert exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'. Subgoal 2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] ============================ exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< RS: case RS. Subgoal 2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS : mem (L, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case RS. Subgoal 2.2.1.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string Hold EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::(((Hold, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold LRemain ============================ exists R', ((Hold, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqHL to _. Subgoal 2.2.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case M. Subgoal 2.2.1.2.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes SaveI ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveI)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string SaveI EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (name Copy)) ([(Copy, recVal R)]::(((SaveI, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain ============================ exists R', ((SaveI, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqIL to _. Subgoal 2.2.1.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveE, V)] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< M: case M. Subgoal 2.2.1.2.2.1: Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes SaveE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveE)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string SaveE EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (name Copy)) ([(Copy, recVal R)]::(((SaveE, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain ============================ exists R', ((SaveE, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< apply NEqEL to _. Subgoal 2.2.1.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) [] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [] ============================ exists R', ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< case M. Subgoal 2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R New IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New)) [] RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal R) G New ============================ exists R', [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1 IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1 EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [] Eq : exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R' ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case IsCtx. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case Is. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal HFs) Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is: case Is. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold Is3 : is_value (recVal HFs) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Is3. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply replaceRecVal_is to _ _ RRVCopy. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Is+: apply replaceScopes_is to _ _ RS. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< apply names_exists to Is+. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< EvBody4: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []. Subgoal 2.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
< unfold . Subgoal 2.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists V1 EE1, <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) V1 EE1 [] /\ replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< exists recVal Fields, [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'). Subgoal 2.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< split. Subgoal 2.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< unfold . Subgoal 2.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists Names E_P V_P EE_P O_P Fields1, (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal Fields1) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ lookup Fields1 "tail" (recVal Fields)) /\ (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) Names /\ (Names |{expr}- tail (name Hold) ~~> E_P /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) E_P V_P EE_P O_P))
< exists Copy::N, recFieldAccess (name Hold) "tail", recVal Fields, [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'), [], HFs. Subgoal 2.3.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\ lookup HFs "tail" (recVal Fields)) /\ (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N) /\ ((Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail" /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []))
< split. Subgoal 2.3.1.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< search. Subgoal 2.3.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ lookup HFs "tail" (recVal Fields)
< search. Subgoal 2.3.1.3: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N)
< search. Subgoal 2.3.1.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ (Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail"
< search. Subgoal 2.3.1.5: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
< search. Subgoal 2.3.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
< unfold . Subgoal 2.3.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ no_lookup [(Copy, recVal R)] Hold
< search. Subgoal 2.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ replaceScopes Hold (recVal Fields) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')
< unfold . Subgoal 2.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ exists I, mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< exists recVal HFs. Subgoal 2.3.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< split. Subgoal 2.3.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
< search. Subgoal 2.3.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< unfold . Subgoal 2.3.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
< unfold . Subgoal 2.3.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ SaveI = Hold -> false
< intros E. Subgoal 2.3.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N E : SaveI = Hold ============================ false
< case E. Subgoal 2.3.2.2.2.1: Variables: Hold SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(Hold, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') N ============================ false
< backchain NEqHI. Subgoal 2.3.2.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [(SaveE, V)] Hold [(SaveE, V)]
< unfold . Subgoal 2.3.2.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ SaveE = Hold -> false
< intros E. Subgoal 2.3.2.2.2.2.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N E : SaveE = Hold ============================ false
< case E. Subgoal 2.3.2.2.2.2.1: Variables: Hold SaveI Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Hold -> false NEqIL : SaveI = L -> false NEqHE : Hold = Hold -> false NEqEL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : Hold = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (Hold, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') N ============================ false
< backchain NEqHE. Subgoal 2.3.2.2.2.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N ============================ remove_all [] Hold []
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< IsV: apply lookup_is_value to _ LkpTl. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] IsV : is_value (recVal Fields) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case IsV. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< case Is+. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< LS': apply replaceScopes_lookupScopes to RS. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< LS'': assert lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R). Subgoal 2.4: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< LS': case LS'. Subgoal 2.4.1: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< L: case LS'. Subgoal 2.4.1.1: Variables: SaveI SaveE Copy L V LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup R "tail" (recVal Fields) LkpNl : lookup R "null" falseVal NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name L))) trueVal ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal R R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string L H3 : is_list (is_pair is_string is_value) R H4 : is_list (is_pair is_string is_value) R H5 : names ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R')) (assign L (tail (name L))) ([(Copy, recVal R)]::([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(L, recVal R), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' ============================ lookupScopes L ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< apply NEqHL to _. Subgoal 2.4.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' L : Hold = L -> false L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< L': case L1. Subgoal 2.4.1.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' L : Hold = L -> false L' : SaveI = L -> false L'1 : lookup [(SaveE, V)] L (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< L'': case L'1. Subgoal 2.4.1.2.1: Variables: Hold SaveI Copy L HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (L, recVal R)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (L, recVal R)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)] H8 : is_list (is_list (is_pair is_string is_value)) R' L : Hold = L -> false L' : SaveI = L -> false ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (L, recVal R)]::R') (recVal R)
< apply NEqEL to _. Subgoal 2.4.1.2.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' L : Hold = L -> false L' : SaveI = L -> false L'' : SaveE = L -> false L''1 : lookup [] L (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< case L''1. Subgoal 2.4.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LS'1 : lookupScopes L R' (recVal R) ============================ lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< Sub: apply IH to ListyH2 IsFE _ ListyH1 ListyH NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC LS''. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< exists G', LV, HFs'. Subgoal 2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV
< split. Subgoal 2.5: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ <evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
< search 20. Subgoal 2.6: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ lookup HFs' "null" trueVal
< search. Subgoal 2.7: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ replaceScopes L LV G G'
< RS: case RS. Subgoal 2.7.1: Variables: Hold SaveI SaveE Copy V HFs LVal FE Names Tl Fields R' N G' LV HFs' I IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] RRVCopy : replaceRecVal "tail" LVal HFs HFs EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] H1 : is_value LVal H2 : is_string Hold EvBody3 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (name Copy)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) R' Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) HFs H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal HFs)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal HFs) LS'' : lookupScopes Hold ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal HFs) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes Hold LV R' G' Sub3 : flipOnto (recVal Fields) (recVal HFs) LV RS : mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)] ============================ replaceScopes Hold LV R' G'
< apply NEqHL to _. Subgoal 2.7.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal R) G R' ============================ replaceScopes L LV G G'
< apply replaceScopes_twice to RS1 Sub2. Subgoal 2.7.2: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal R) G R' H9 : replaceScopes L LV G G' ============================ replaceScopes L LV G G'
< search. Subgoal 2.8: Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs' IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) -> lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal -> exists G' LV HFs', ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal HFs) LVal LV IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE LkpTl : lookup HFs "tail" (recVal Fields) LkpNl : lookup HFs "null" falseVal NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names ListyH : lookup Fields "null" falseVal ListyH1 : lookup Fields "tail" Tl ListyH2 : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] RRVCopy : replaceRecVal "tail" LVal HFs R EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] H1 : is_value LVal H2 : is_string L RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] Is : is_string Hold H3 : is_list (is_pair is_string is_value) HFs H4 : is_list (is_pair is_string is_value) R H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [] H6 : is_list (is_pair is_string is_value) Fields H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] H8 : is_list (is_list (is_pair is_string is_value)) R' LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R) Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs' "null" trueVal Sub2 : replaceScopes L LV R' G' Sub3 : flipOnto (recVal Fields) (recVal R) LV ============================ flipOnto (recVal HFs) LVal LV
< search. Proof completed.
< Theorem proj_listUpdate_eval : forall OldL I (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) HoldL V NewL G FE, updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV. ============================ forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV
< induction on 1. IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV ============================ forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL @ -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV
< intros ULI NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC ListyH GEqI0 IsFE Is+ IsC LS. Variables: OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV ULI : updateListIndex OldL I V NewL @ NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV
< ULI: case ULI. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []. Subgoal 1.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
< search 10. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvCheck: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []. Subgoal 1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] ============================ <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
< Names: apply names_exists to Is+. Subgoal 1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] Names : names ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) N ============================ <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
< search 10. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvMid: assert exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'. Subgoal 1.3: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< IsL: apply lookupScopes_is to _ LS. Subgoal 1.3: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< RS: apply lookupScopes_replaceScopes_exists to _ _ LS with V' = recVal NewFields. Subgoal 1.3: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) R ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< RS: case RS (keep). Subgoal 1.3.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G) RS1 : mem (L, I1) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< M: case RS1. Subgoal 1.3.1.1: Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string Hold RS : replaceScopes Hold (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((Hold, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Hold LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate Hold ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes Hold (recVal NewFields) G G'
< apply NEqHL to _. Subgoal 1.3.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I1) [(SaveI, intVal 0), (SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< M: case M. Subgoal 1.3.1.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string SaveI RS : replaceScopes SaveI (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveI, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate SaveI ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes SaveI (recVal NewFields) G G'
< apply NEqIL to _. Subgoal 1.3.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I1) [(SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< M: case M. Subgoal 1.3.1.2.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string SaveE RS : replaceScopes SaveE (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveE, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate SaveE ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes SaveE (recVal NewFields) G G'
< apply NEqEL to _. Subgoal 1.3.1.2.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I1) [] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< case M. Subgoal 1.3.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields New IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] IsL : is_value (recVal Fields) IsL1 : is_string L RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L RS2 : replaceScopes L (recVal NewFields) G New ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G'
< search 20. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ replaceScopes L (recVal NewFields) G G' ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvMid: case EvMid. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields G' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< ListyH': case ListyH (keep). Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< exists G', recVal NewFields, Fields1. Subgoal 1.4: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup Fields1 "null" trueVal) /\ replaceScopes L (recVal NewFields) G G') /\ flipOnto (recVal Fields1) (recVal NewFields) (recVal NewFields)
< split. Subgoal 1.4.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< unfold . Subgoal 1.4.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1 /\ (<evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G, [], []. Subgoal 1.4.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ [] ++ [] = [])
< split. Subgoal 1.4.1.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
< search. Subgoal 1.4.1.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< unfold . Subgoal 1.4.1.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE1 O1 /\ (<evalStmt {P}> FE EE1 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G, [], []. Subgoal 1.4.1.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ [] ++ [] = [])
< split. Subgoal 1.4.1.2.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
< search. Subgoal 1.4.1.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< unfold . Subgoal 1.4.1.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) EE1 O1 /\ (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G', [], []. Subgoal 1.4.1.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ [] ++ [] = [])
< split. Subgoal 1.4.1.2.2.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< search. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< IsLV: apply lookupScopes_is to _ LS. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV : is_value (recVal Fields) IsLV1 : is_string L ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< case IsLV. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< Is: case Is+. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is : is_list (is_pair is_string is_value) [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< Is: case Is. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< Is: case Is2. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< Is: case Is3. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is3 : is_pair is_string is_value (SaveE, V) Is4 : is_list (is_pair is_string is_value) [] ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< case Is3. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] H2 : is_string SaveE H3 : is_value V ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< apply replaceRecVal_is to _ _ ULI1. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] H2 : is_string SaveE H3 : is_value V H4 : is_list (is_pair is_string is_value) NewFields ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< IsG': apply replaceScopes_is to _ _ EvMid1. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] H2 : is_string SaveE H3 : is_value V H4 : is_list (is_pair is_string is_value) NewFields IsG' : is_list (is_list (is_pair is_string is_value)) G' ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< apply names_exists to IsG'. Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] H2 : is_string SaveE H3 : is_value V H4 : is_list (is_pair is_string is_value) NewFields IsG' : is_list (is_list (is_pair is_string is_value)) G' H5 : names G' N ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< assert (Hold::(SaveI::(SaveE::N))) |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null". Subgoal 1.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal IsLV1 : is_string L H1 : is_list (is_pair is_string is_value) Fields Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] H2 : is_string SaveE H3 : is_value V H4 : is_list (is_pair is_string is_value) NewFields IsG' : is_list (is_list (is_pair is_string is_value)) G' H5 : names G' N H6 : (Hold::(SaveI::(SaveE::N))) |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< search 20. Subgoal 1.4.1.2.2.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ [] ++ [] = []
< search. Subgoal 1.4.1.2.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ [] ++ [] = []
< search. Subgoal 1.4.1.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ [] ++ [] = []
< search. Subgoal 1.4.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ lookup Fields1 "null" trueVal
< search. Subgoal 1.4.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ replaceScopes L (recVal NewFields) G G'
< search. Subgoal 1.4.4: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" trueVal ============================ flipOnto (recVal Fields1) (recVal NewFields) (recVal NewFields)
< search. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< LS': assert lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields). Subgoal 1.5.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl ============================ lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
< apply replaceScopes_lookupScopes_same to EvMid1. Subgoal 1.5.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl H1 : lookupScopes L G' (recVal NewFields) ============================ lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
< search. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< IsL: apply lookupScopes_is to _ LS. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< Is: case Is+. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< Is: case Is. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< Is: case Is2. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< Is: case Is3. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is3 : is_pair is_string is_value (SaveE, V) Is4 : is_list (is_pair is_string is_value) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< Is: case Is3. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< EvMid': apply drop_proj_rel_evalStmt to EvMid. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< apply lookupScopes_is to _ LS. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< apply evalStmt_isCtx to _ _ _ EvMid'. Subgoal 1.5.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L ============================ is_stmt (recUpdate L ["head"] (name SaveE))
< search 10. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< EvLoop2: apply eval_update_loop2 to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with Hold = Hold SaveI = SaveI SaveE = SaveE L = L V = V HoldL = Tl LVal = recVal NewFields G = G' FE = FE Copy = Copy. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< exists G'1, LV, HFs'. Subgoal 1.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\ lookup HFs' "null" trueVal) /\ replaceScopes L LV G G'1) /\ flipOnto (recVal Fields1) (recVal NewFields) LV
< split. Subgoal 1.5.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
< unfold . Subgoal 1.5.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1 /\ (<evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G, [], []. Subgoal 1.5.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\ [] ++ [] = [])
< split. Subgoal 1.5.3.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
< search. Subgoal 1.5.3.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
< unfold . Subgoal 1.5.3.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE1 O1 /\ (<evalStmt {P}> FE EE1 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G, [], []. Subgoal 1.5.3.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\ [] ++ [] = [])
< split. Subgoal 1.5.3.2.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
< search. Subgoal 1.5.3.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
< unfold . Subgoal 1.5.3.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) EE1 O1 /\ (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\ O1 ++ O2 = [])
< exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G', [], []. Subgoal 1.5.3.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\ [] ++ [] = [])
< split. Subgoal 1.5.3.2.2.1: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
< search. Subgoal 1.5.3.2.2.2: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
< search. Subgoal 1.5.3.2.2.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ [] ++ [] = []
< search. Subgoal 1.5.3.2.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ [] ++ [] = []
< search. Subgoal 1.5.3.3: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ [] ++ [] = []
< search. Subgoal 1.5.4: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ lookup HFs' "null" trueVal
< search. Subgoal 1.5.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ replaceScopes L LV G G'1
< apply replaceScopes_twice to EvMid1 EvLoop4. Subgoal 1.5.5: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV H4 : replaceScopes L LV G G'1 ============================ replaceScopes L LV G G'1
< search. Subgoal 1.5.6: Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields1) GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] EvMid1 : replaceScopes L (recVal NewFields) G G' ListyH' : lookup Fields1 "null" falseVal ListyH'1 : lookup Fields1 "tail" Tl ListyH'2 : listy Tl LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields) IsL : is_value (recVal Fields) IsL1 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, recVal Fields1) Is2 : is_pair is_string is_value (SaveI, intVal 0) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] H1 : is_value (recVal Fields) H2 : is_string L H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] EvLoop3 : lookup HFs' "null" trueVal EvLoop4 : replaceScopes L LV G' G'1 EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV ============================ flipOnto (recVal Fields1) (recVal NewFields) LV
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< GEqI1: apply updateListIndex_pos to ULI3. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvCond1: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []. Subgoal 2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< unfold . Subgoal 2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< unfold . Subgoal 2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ exists V1 EE1 O1 V2 O2, <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) V1 EE1 O1 /\ (<evalExpr {P}> FE EE1 (num 0) V2 ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) O2 /\ ((V1 = V2 -> false) /\ O1 ++ O2 = []))
< exists intVal I, [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G, [], intVal 0, []. Subgoal 2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] /\ (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] /\ ((intVal I = intVal 0 -> false) /\ [] ++ [] = []))
< split. Subgoal 2.1.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< search. Subgoal 2.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< search. Subgoal 2.1.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ intVal I = intVal 0 -> false
< Or: apply greatereq_integer_greater_or_eq to GEqI0. Subgoal 2.1.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 Or : I > 0 \/ I = 0 ============================ intVal I = intVal 0 -> false
< C: case Or. Subgoal 2.1.3.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 C : I > 0 ============================ intVal I = intVal 0 -> false
< intros E. Subgoal 2.1.3.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 C : I > 0 E : intVal I = intVal 0 ============================ false
< case E. Subgoal 2.1.3.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : 0 - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 C : 0 > 0 ============================ false
< apply greater_integer_not_eq to C. Subgoal 2.1.3.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : 0 - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ intVal 0 = intVal 0 -> false
< compute ULI1. Subgoal 2.1.3.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : 0 - 1 = -1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl -1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : -1 >= 0 ============================ intVal 0 = intVal 0 -> false
< LEq: case GEqI1. Subgoal 2.1.3.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : 0 >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : 0 - 1 = -1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl -1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields LEq : 0 <= -1 ============================ intVal 0 = intVal 0 -> false
< case LEq. Subgoal 2.1.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 ============================ [] ++ [] = []
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvCond2: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []. Subgoal 2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< apply names_exists to Is+. Subgoal 2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] H1 : names ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) N ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvCond: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBodyA: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []. Subgoal 2.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< unfold . Subgoal 2.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ exists V1 EE1, <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V1 EE1 [] /\ replaceScopes SaveI V1 EE1 ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
< exists intVal I1, []::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G). Subgoal 2.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) [] /\ replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
< split. Subgoal 2.3.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) []
< search 20. Subgoal 2.3.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
< assert SaveE = SaveI -> false. Subgoal 2.3.2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] ============================ SaveE = SaveI -> false
< intros E. Subgoal 2.3.2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] E : SaveE = SaveI ============================ false
< case E. Subgoal 2.3.2.1: Variables: I Hold SaveI Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) [] ============================ false
< backchain NEqIE. Subgoal 2.3.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] H1 : SaveE = SaveI -> false ============================ replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
< search 20. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBodyB: assert <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []. Subgoal 2.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< unfold . Subgoal 2.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (recVal Fields) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< unfold . Subgoal 2.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< LS: case LS. Subgoal 2.4.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] LS : lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L (recVal Fields) ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< L: case LS. Subgoal 2.4.1.1: Variables: I SaveI SaveE Copy L V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields) GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) [] ============================ lookupScopes L ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (recVal Fields)
< apply NEqHL to _. Subgoal 2.4.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] L : Hold = L -> false L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields) ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< L': case L1. Subgoal 2.4.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false L'1 : lookup [(SaveE, V)] L (recVal Fields) ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< L'': case L'1. Subgoal 2.4.1.2.1: Variables: I Hold SaveI Copy L HoldL G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 (recVal Fields) TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (recVal Fields)
< apply NEqEL to _. Subgoal 2.4.1.2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false L'' : SaveE = L -> false L''1 : lookup [] L (recVal Fields) ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< case L''1. Subgoal 2.4.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] LS : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LS1 : lookupScopes L G (recVal Fields) ============================ lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< search 10. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< RRV: apply lookup_replaceRecVal_exists to ULI2 with V' = HoldL. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBodyC: assert <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []. Subgoal 2.5: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< unfold . Subgoal 2.5: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ exists V1 EE1 FieldVals NewVals, <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V1 EE1 [] /\ (lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) /\ (updateRecFields ["tail"] V1 FieldVals NewVals /\ replaceScopes Copy (recVal NewVals) EE1 ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))))
< exists HoldL, [(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G), Fields, R. Subgoal 2.5: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] /\ (lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields) /\ (updateRecFields ["tail"] HoldL Fields R /\ replaceScopes Copy (recVal R) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))))
< split. Subgoal 2.5.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< assert SaveI = Hold -> false. Subgoal 2.5.1.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ SaveI = Hold -> false
< intros E. Subgoal 2.5.1.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R E : SaveI = Hold ============================ false
< case E. Subgoal 2.5.1.1: Variables: I Hold SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (eq (name Hold) (num 0))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (and (not (eq (name Hold) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)) (assign Hold (minus (name Hold) (num 1))) ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ false
< backchain NEqHI. Subgoal 2.5.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R H1 : SaveI = Hold -> false ============================ <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< search. Subgoal 2.5.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
< search. Subgoal 2.5.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ updateRecFields ["tail"] HoldL Fields R
< search. Subgoal 2.5.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R ============================ replaceScopes Copy (recVal R) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBodyD: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []. Subgoal 2.6: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
< unfold . Subgoal 2.6: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ exists V1 EE1, <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V1 EE1 [] /\ replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
< exists recVal R, [(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G). Subgoal 2.6: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] /\ replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
< split. Subgoal 2.6.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
< search. Subgoal 2.6.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
< assert SaveI = Hold -> false. Subgoal 2.6.2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ SaveI = Hold -> false
< intros E. Subgoal 2.6.2.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] E : SaveI = Hold ============================ false
< case E. Subgoal 2.6.2.1: Variables: I Hold SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (eq (name Hold) (num 0))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (and (not (eq (name Hold) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)) (assign Hold (minus (name Hold) (num 1))) ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ false
< backchain NEqHI. Subgoal 2.6.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] H1 : SaveI = Hold -> false ============================ replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
< assert SaveE = Hold -> false. Subgoal 2.6.2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] H1 : SaveI = Hold -> false ============================ SaveE = Hold -> false
< intros E. Subgoal 2.6.2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] H1 : SaveI = Hold -> false E : SaveE = Hold ============================ false
< case E. Subgoal 2.6.2.2: Variables: I Hold SaveI Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Hold -> false NEqIL : SaveI = L -> false NEqHE : Hold = Hold -> false NEqEL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : Hold = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) [] H1 : SaveI = Hold -> false ============================ false
< backchain NEqHE. Subgoal 2.6.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] H1 : SaveI = Hold -> false H2 : SaveE = Hold -> false ============================ replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
< search 20. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< LS': assert lookupScopes L G (recVal Fields). Subgoal 2.7: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] ============================ lookupScopes L G (recVal Fields)
< LS: case LS. Subgoal 2.7.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS : lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L (recVal Fields) ============================ lookupScopes L G (recVal Fields)
< L: case LS. Subgoal 2.7.1.1: Variables: I SaveI SaveE Copy L V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy (recVal Fields) GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" (recVal Fields) Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] ============================ lookupScopes L G (recVal Fields)
< apply NEqHL to _. Subgoal 2.7.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] L : Hold = L -> false L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields) ============================ lookupScopes L G (recVal Fields)
< L': case L1. Subgoal 2.7.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false L'1 : lookup [(SaveE, V)] L (recVal Fields) ============================ lookupScopes L G (recVal Fields)
< L'': case L'1. Subgoal 2.7.1.2.1: Variables: I Hold SaveI Copy L HoldL G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 (recVal Fields) TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (L, recVal Fields)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false ============================ lookupScopes L G (recVal Fields)
< apply NEqEL to _. Subgoal 2.7.1.2.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] L : Hold = L -> false L' : SaveI = L -> false L'' : SaveE = L -> false L''1 : lookup [] L (recVal Fields) ============================ lookupScopes L G (recVal Fields)
< case L''1. Subgoal 2.7.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LS1 : lookupScopes L G (recVal Fields) ============================ lookupScopes L G (recVal Fields)
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< apply lookupScopes_is to _ LS. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Is: case Is+. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< apply lookupScopes_replaceScopes_exists to _ _ LS' with V' = Tl. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBodyE: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []. Subgoal 2.8: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
< unfold . Subgoal 2.8: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ exists V1 EE1, <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) V1 EE1 [] /\ replaceScopes L V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
< exists Tl, [(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G). Subgoal 2.8: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\ replaceScopes L Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
< split. Subgoal 2.8.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
< apply names_exists to Is1. Subgoal 2.8.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
< unfold . Subgoal 2.8.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ exists Names E_P V_P EE_P O_P Fields, (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\ lookup Fields "tail" Tl) /\ (names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) Names /\ (Names |{expr}- tail (name L) ~~> E_P /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) E_P V_P EE_P O_P))
< exists Copy::(Hold::(SaveI::(SaveE::N))), recFieldAccess (name L) "tail", Tl, [(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G), [], Fields. Subgoal 2.8.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\ lookup Fields "tail" Tl) /\ (names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (Copy::(Hold::(SaveI::(SaveE::N)))) /\ ((Copy::(Hold::(SaveI::(SaveE::N)))) |{expr}- tail (name L) ~~> recFieldAccess (name L) "tail" /\ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (recFieldAccess (name L) "tail") Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []))
< split. Subgoal 2.8.1.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
< search 20. Subgoal 2.8.1.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ lookup Fields "tail" Tl
< search. Subgoal 2.8.1.3: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (Copy::(Hold::(SaveI::(SaveE::N))))
< search 10. Subgoal 2.8.1.4: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ (Copy::(Hold::(SaveI::(SaveE::N)))) |{expr}- tail (name L) ~~> recFieldAccess (name L) "tail"
< search. Subgoal 2.8.1.5: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 H4 : names G N ============================ <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (recFieldAccess (name L) "tail") Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
< search 20. Subgoal 2.8.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 ============================ replaceScopes L Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
< search 20. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBodyE : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBody: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] RRV : replaceRecVal "tail" HoldL Fields R EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBodyE : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< clear EvBodyA EvBodyB EvBodyC EvBodyD EvBodyE. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< ListyH': assert listy (recVal R). Subgoal 2.9: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ============================ listy (recVal R)
< apply replaceRecVal_lookup to RRV. Subgoal 2.9: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H4 : lookup R "tail" HoldL ============================ listy (recVal R)
< apply replaceRecVal_lookup_other to RRV ULI _. Subgoal 2.9: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H4 : lookup R "tail" HoldL H5 : lookup R "null" falseVal ============================ listy (recVal R)
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Is: case Is. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Is: case Is2. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is2 : is_pair is_string is_value (SaveI, intVal I) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Is: case Is2. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] Is2 : is_string SaveI Is4 : is_value (intVal I) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< case Is4. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] Is2 : is_string SaveI H4 : is_integer I ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< apply minus_integer_is_integer to _ _ ULI1. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvBody': apply drop_proj_rel_evalStmt to EvBody. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is : is_pair is_string is_value (Hold, HoldL) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< case Is. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Is: case Is3. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is : is_pair is_string is_value (SaveE, V) Is3 : is_list (is_pair is_string is_value) [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< case Is. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< IsR1+: apply evalStmt_isCtx to _ _ _ EvBody'. Subgoal 2.10: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G))
< search 10. Subgoal 2.11: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V ============================ is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
< search 20. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< assert lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl. Subgoal 2.12: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) ============================ lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
< apply replaceScopes_lookupScopes_same to H3. Subgoal 2.12: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) H10 : lookupScopes L R1 Tl ============================ lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
< search. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< case IsR1+. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< Sub: apply IH to ULI3 NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC ListyH' _ IsFE _ IsC _. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvSub: case Sub. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 O1 O2 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1 EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') O2 EvSub2 : O1 ++ O2 = [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< case EvSub2. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< exists G', LV, HFs. Subgoal 2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL (recVal NewFields) LV
< split. Subgoal 2.13: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
< search. Subgoal 2.14: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ lookup HFs "null" trueVal
< search. Subgoal 2.15: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ replaceScopes L LV G G'
< apply replaceScopes_twice to H3 Sub2. Subgoal 2.15: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] H13 : replaceScopes L LV G G' ============================ replaceScopes L LV G G'
< search. Subgoal 2.16: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' Sub3 : flipOnto (recVal R) TlNew LV EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] ============================ flipOnto HoldL (recVal NewFields) LV
< FO: case Sub3. Subgoal 2.16.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V LV * ULI4 : replaceRecVal "tail" LV Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" trueVal ============================ flipOnto HoldL (recVal NewFields) LV
< L: apply replaceRecVal_lookup_other to RRV ULI _. Subgoal 2.16.1: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V LV * ULI4 : replaceRecVal "tail" LV Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" trueVal L : lookup R "null" falseVal ============================ flipOnto HoldL (recVal NewFields) LV
< apply lookup_unique to FO L. Subgoal 2.16.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' T IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" falseVal FO1 : lookup R "tail" T FO2 : replaceRecVal "tail" TlNew R Fields' FO3 : flipOnto T (recVal Fields') LV ============================ flipOnto HoldL (recVal NewFields) LV
< L: apply replaceRecVal_lookup to RRV. Subgoal 2.16.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' T IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" falseVal FO1 : lookup R "tail" T FO2 : replaceRecVal "tail" TlNew R Fields' FO3 : flipOnto T (recVal Fields') LV L : lookup R "tail" HoldL ============================ flipOnto HoldL (recVal NewFields) LV
< apply lookup_unique to FO1 L. Subgoal 2.16.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" falseVal FO1 : lookup R "tail" HoldL FO2 : replaceRecVal "tail" TlNew R Fields' FO3 : flipOnto HoldL (recVal Fields') LV L : lookup R "tail" HoldL ============================ flipOnto HoldL (recVal NewFields) LV
< RRV': apply replaceRecVal_twice to RRV FO2. Subgoal 2.16.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" falseVal FO1 : lookup R "tail" HoldL FO2 : replaceRecVal "tail" TlNew R Fields' FO3 : flipOnto HoldL (recVal Fields') LV L : lookup R "tail" HoldL RRV' : replaceRecVal "tail" TlNew Fields Fields' ============================ flipOnto HoldL (recVal NewFields) LV
< apply replaceRecVal_unique to RRV' ULI4. Subgoal 2.16.2: Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE, updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV HFs, ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\ lookup HFs "null" trueVal) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ListyH : listy HoldL GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsC : is_string Copy LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields) ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields GEqI1 : I1 >= 0 EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] RRV : replaceRecVal "tail" HoldL Fields R LS' : lookupScopes L G (recVal Fields) H1 : is_value (recVal Fields) H2 : is_string L Is1 : is_list (is_list (is_pair is_string is_value)) G H3 : replaceScopes L Tl G R1 EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] ListyH' : listy (recVal R) Is2 : is_string SaveI H4 : is_integer I H5 : is_integer I1 EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [] H6 : is_string Hold H7 : is_value HoldL Is3 : is_list (is_pair is_string is_value) [] H8 : is_string SaveE H9 : is_value V H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)] H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Sub1 : lookup HFs "null" trueVal Sub2 : replaceScopes L LV R1 G' EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [] FO : lookup R "null" falseVal FO1 : lookup R "tail" HoldL FO2 : replaceRecVal "tail" TlNew R NewFields FO3 : flipOnto HoldL (recVal NewFields) LV L : lookup R "tail" HoldL RRV' : replaceRecVal "tail" TlNew Fields NewFields ============================ flipOnto HoldL (recVal NewFields) LV
< search. Proof completed.
< Theorem replaceScopes_lookupScopes_other [Key, Item] : forall (X : Key) (XV : Item) L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV -> (X = Y -> false) -> lookupScopes Y R YV. ============================ forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV -> (X = Y -> false) -> lookupScopes Y R YV
< induction on 2. IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV ============================ forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV @ -> (X = Y -> false) -> lookupScopes Y R YV
< intros RS LS NEq. Variables: X XV L R Y YV IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV RS : replaceScopes X XV L R LS : lookupScopes Y L YV @ NEq : X = Y -> false ============================ lookupScopes Y R YV
< LS: case LS. Subgoal 1: Variables: X XV R Y YV Rest L1 IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV RS : replaceScopes X XV (L1::Rest) R NEq : X = Y -> false LS : lookup L1 Y YV ============================ lookupScopes Y R YV
< RS: case RS. Subgoal 1.1: Variables: X XV Y YV Rest L1 I LRemain IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : lookup L1 Y YV RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain ============================ lookupScopes Y (((X, XV)::LRemain)::Rest) YV
< apply remove_all_lookup_other_back to RS1 LS _. Subgoal 1.1: Variables: X XV Y YV Rest L1 I LRemain IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : lookup L1 Y YV RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain H1 : lookup LRemain Y YV ============================ lookupScopes Y (((X, XV)::LRemain)::Rest) YV
< search. Subgoal 1.2: Variables: X XV Y YV Rest L1 New IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : lookup L1 Y YV RS : no_lookup L1 X RS1 : replaceScopes X XV Rest New ============================ lookupScopes Y (L1::New) YV
< search. Subgoal 2: Variables: X XV R Y YV Rest L1 IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV RS : replaceScopes X XV (L1::Rest) R NEq : X = Y -> false LS : no_lookup L1 Y LS1 : lookupScopes Y Rest YV * ============================ lookupScopes Y R YV
< RS: case RS. Subgoal 2.1: Variables: X XV Y YV Rest L1 I LRemain IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : no_lookup L1 Y LS1 : lookupScopes Y Rest YV * RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain ============================ lookupScopes Y (((X, XV)::LRemain)::Rest) YV
< apply remove_all_no_lookup_back to RS1 LS. Subgoal 2.1: Variables: X XV Y YV Rest L1 I LRemain IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : no_lookup L1 Y LS1 : lookupScopes Y Rest YV * RS : mem (X, I) L1 RS1 : remove_all L1 X LRemain H1 : no_lookup LRemain Y ============================ lookupScopes Y (((X, XV)::LRemain)::Rest) YV
< search. Subgoal 2.2: Variables: X XV Y YV Rest L1 New IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : no_lookup L1 Y LS1 : lookupScopes Y Rest YV * RS : no_lookup L1 X RS1 : replaceScopes X XV Rest New ============================ lookupScopes Y (L1::New) YV
< apply IH to RS1 LS1 _. Subgoal 2.2: Variables: X XV Y YV Rest L1 New IH : forall X XV L R Y YV, replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV NEq : X = Y -> false LS : no_lookup L1 Y LS1 : lookupScopes Y Rest YV * RS : no_lookup L1 X RS1 : replaceScopes X XV Rest New H1 : lookupScopes Y New YV ============================ lookupScopes Y (L1::New) YV
< search. Proof completed.
< Theorem eval_update_loop2_listy : forall (Hold : string) (Copy : string) (L : string) FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV. ============================ forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV
< induction on 1. IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV ============================ forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O @ -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV
< intros Ev NEqHL NEqCH NEqCL LL LH. Variables: Hold Copy L FE G G' O LVal HVal IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV Ev : evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O @ NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< Ev: case Ev. Subgoal 1: Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev : evalExpr FE G (not (null (name Hold))) trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< clear Ev3 Ev4. Subgoal 1: Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev : evalExpr FE G (not (null (name Hold))) trueVal EE1 O2 * Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< EvC: case Ev. Subgoal 1: Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC : evalExpr FE G (null (name Hold)) falseVal EE1 O2 * ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< EvC: case EvC. Subgoal 1: Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC : evalExpr FE G (name Hold) (recVal Fields) EE1 O2 * EvC1 : lookup Fields "null" falseVal ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< LH': case EvC. Subgoal 1: Variables: Hold Copy L FE G' O LVal HVal EE1 Scope EE2 O3 O4 O12 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 HVal Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal LH' : lookupScopes Hold EE1 (recVal Fields) ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< apply lookupScopes_unique to LH' LH. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal LH' : lookupScopes Hold EE1 (recVal Fields) ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< clear LH'. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 * Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< EvB: case Ev1. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) (Scope::EE2) O5 * EvB2 : O1 ++ O5 = O3 ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< clear EvB2. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) (Scope::EE2) O5 * ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< EvB: case EvB1. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) (Scope::EE2) O7 * EvB3 : O6 ++ O7 = O5 ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< clear EvB3. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) (Scope::EE2) O7 * ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< EvB: case EvB2. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 EE5 O8 O9 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvB4 : O8 ++ O9 = O7 ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< clear EvB4. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 EE5 O8 O9 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 * EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< EvA: case EvB. Subgoal 1: Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields O1 O5 EE4 O6 O7 EE5 O8 O9 EE6 Scope1 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE1 LVal LH : lookupScopes Hold EE1 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE (((Copy, V)::Scope1)::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA : evalExpr FE ([]::EE1) (name Hold) V (Scope1::EE6) O1 * ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< L: case EvA. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 Fields O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal Fields) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookupScopes Hold ([]::EE6) V ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< rename Fields to HFs. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookupScopes Hold ([]::EE6) V ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert V = recVal HFs. Subgoal 1.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookupScopes Hold ([]::EE6) V ============================ V = recVal HFs
< L: case L. Subgoal 1.1.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookup [] Hold V ============================ V = recVal HFs
< case L. Subgoal 1.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : no_lookup [] Hold L1 : lookupScopes Hold EE6 V ============================ V = recVal HFs
< apply lookupScopes_unique to L1 LH. Subgoal 1.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : no_lookup [] Hold L1 : lookupScopes Hold EE6 (recVal HFs) ============================ recVal HFs = recVal HFs
< search. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookupScopes Hold ([]::EE6) V Eq : V = recVal HFs ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * L : lookupScopes Hold ([]::EE6) (recVal HFs) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear L. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 * EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< EvA: case EvB1. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V1 EE7 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA : evalExpr FE ([(Copy, recVal HFs)]::EE6) (name L) V1 EE7 O6 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) EE7 EE4 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LL': case EvA. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert V1 = LVal. Subgoal 1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1 ============================ V1 = LVal
< L: case LL'. Subgoal 1.2.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : lookup [(Copy, recVal HFs)] L V1 ============================ V1 = LVal
< L: case L. Subgoal 1.2.1.1: Variables: Hold L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : L = Hold -> false NEqCL : L = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name L)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes L ([(L, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] (recVal HFs) FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal HFs)]::EE6) EE4 ============================ recVal HFs = LVal
< apply NEqCL to _. Subgoal 1.2.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : Copy = L -> false L1 : lookup [] L V1 ============================ V1 = LVal
< case L1. Subgoal 1.2.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : no_lookup [(Copy, recVal HFs)] L L1 : lookupScopes L EE6 V1 ============================ V1 = LVal
< apply lookupScopes_unique to L1 LL. Subgoal 1.2.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : no_lookup [(Copy, recVal HFs)] L L1 : lookupScopes L EE6 LVal ============================ LVal = LVal
< search. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1 Eq : V1 = LVal ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) LVal ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear LL'. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert FieldVals = HFs. Subgoal 1.3: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 ============================ FieldVals = HFs
< L: case EvA1. Subgoal 1.3.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : lookup [(Copy, recVal HFs)] Copy (recVal FieldVals) ============================ FieldVals = HFs
< L: case L. Subgoal 1.3.1.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal FieldVals) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup FieldVals "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::EE6) EE4 ============================ FieldVals = FieldVals
< search. Subgoal 1.3.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : Copy = Copy -> false L1 : lookup [] Copy (recVal FieldVals) ============================ FieldVals = HFs
< apply L to _. Subgoal 1.3.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L : no_lookup [(Copy, recVal HFs)] Copy L1 : lookupScopes Copy EE6 (recVal FieldVals) ============================ FieldVals = HFs
< N: case L. Subgoal 1.3.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 L1 : lookupScopes Copy EE6 (recVal FieldVals) N : Copy = Copy -> false N1 : no_lookup [] Copy ============================ FieldVals = HFs
< apply N to _. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals) EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 Eq : FieldVals = HFs ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal HFs) EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear EvA1. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert EE4 = [(Copy, recVal NewVals)]::EE6. Subgoal 1.4: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 ============================ EE4 = [(Copy, recVal NewVals)]::EE6
< RS: case EvA3. Subgoal 1.4.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : mem (Copy, I) [(Copy, recVal HFs)] RS1 : remove_all [(Copy, recVal HFs)] Copy LRemain ============================ ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE6
< RA: case RS1. Subgoal 1.4.1.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : mem (Copy, I) [(Copy, recVal HFs)] RA : remove_all [] Copy LRemain ============================ ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE6
< case RA. Subgoal 1.4.1.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE ([(Copy, recVal NewVals)]::EE6) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : mem (Copy, I) [(Copy, recVal HFs)] ============================ [(Copy, recVal NewVals)]::EE6 = [(Copy, recVal NewVals)]::EE6
< search. Subgoal 1.4.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I R IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE (((Copy, recVal NewVals)::((Copy, recVal HFs)::R))::EE6) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : mem (Copy, I) [(Copy, recVal HFs)] RA : Copy = Copy -> false RA1 : remove_all [] Copy R ============================ ((Copy, recVal NewVals)::((Copy, recVal HFs)::R))::EE6 = [(Copy, recVal NewVals)]::EE6
< apply RA to _. Subgoal 1.4.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals New IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE ([(Copy, recVal HFs)]::New) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : no_lookup [(Copy, recVal HFs)] Copy RS1 : replaceScopes Copy (recVal NewVals) EE6 New ============================ [(Copy, recVal HFs)]::New = [(Copy, recVal NewVals)]::EE6
< N: case RS. Subgoal 1.4.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals New IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE ([(Copy, recVal HFs)]::New) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS1 : replaceScopes Copy (recVal NewVals) EE6 New N : Copy = Copy -> false N1 : no_lookup [] Copy ============================ [(Copy, recVal HFs)]::New = [(Copy, recVal NewVals)]::EE6
< apply N to _. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4 Eq : EE4 = [(Copy, recVal NewVals)]::EE6 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB2 : evalStmt FE ([(Copy, recVal NewVals)]::EE6) (assign L (name Copy)) EE5 O8 * EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< EvL: case EvB2. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals V2 EE8 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6) EvL : evalExpr FE ([(Copy, recVal NewVals)]::EE6) (name Copy) V2 EE8 O8 * EvL1 : replaceScopes L V2 EE8 EE5 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LC: case EvL. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals V2 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6) EvL1 : replaceScopes L V2 ([(Copy, recVal NewVals)]::EE6) EE5 LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) V2 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LC': apply replaceScopes_lookupScopes to EvA3. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals V2 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6) EvL1 : replaceScopes L V2 ([(Copy, recVal NewVals)]::EE6) EE5 LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) V2 LC' : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< apply lookupScopes_unique to LC' LC. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6) EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5 LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals) LC' : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear LC LC' EvA3. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert exists EE', EE5 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE'. Subgoal 1.5: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5 ============================ exists EE', EE5 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE'
< RS: case EvL1. Subgoal 1.5.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE (((L, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : mem (L, I) [(Copy, recVal NewVals)] RS1 : remove_all [(Copy, recVal NewVals)] L LRemain ============================ exists EE', ((L, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE'
< M: case RS. Subgoal 1.5.1.1: Variables: Hold Copy FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = Copy -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Copy -> false LL : lookupScopes Copy EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain ============================ exists EE', ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes Copy (recVal NewVals) EE6 EE'
< apply NEqCL to _. Subgoal 1.5.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE (((L, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS1 : remove_all [(Copy, recVal NewVals)] L LRemain M : mem (L, I) [] ============================ exists EE', ((L, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE'
< case M. Subgoal 1.5.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals New IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::New) (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RS : no_lookup [(Copy, recVal NewVals)] L RS1 : replaceScopes L (recVal NewVals) EE6 New ============================ exists EE', [(Copy, recVal NewVals)]::New = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE'
< search. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5 Eq : exists EE', EE5 = [(Copy, recVal NewVals)]::EE' /\ replaceScopes L (recVal NewVals) EE6 EE' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< RSL: case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::EE') (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) ([(Copy, recVal NewVals)]::EE') RSL : replaceScopes L (recVal NewVals) EE6 EE' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear EvL1. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::EE') (assign Hold (tail (name Hold))) (Scope::EE2) O9 * EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< EvH: case EvB3. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' V3 EE9 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH : evalExpr FE ([(Copy, recVal NewVals)]::EE') (tail (name Hold)) V3 EE9 O9 * EvH1 : replaceScopes Hold V3 EE9 (Scope::EE2) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< EvH: case EvH. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' V3 EE9 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 EE9 (Scope::EE2) EvH : evalExpr FE ([(Copy, recVal NewVals)]::EE') (name Hold) (recVal Fields) EE9 O9 * EvH2 : lookup Fields "tail" V3 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LH+: case EvH. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert Fields = HFs /\ lookupScopes Hold EE' (recVal HFs). Subgoal 1.6: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields) ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< L: case LH+. Subgoal 1.6.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : lookup [(Copy, recVal NewVals)] Hold (recVal Fields) ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< L: case L. Subgoal 1.6.1.1: Variables: Hold L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Hold = Hold -> false NEqCL : Hold = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs Fields RSL : replaceScopes L (recVal Fields) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Hold, recVal Fields)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< apply NEqCH to _. Subgoal 1.6.1.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : Copy = Hold -> false L1 : lookup [] Hold (recVal Fields) ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< case L1. Subgoal 1.6.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< assert L = Hold -> false. Subgoal 1.6.2.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) ============================ L = Hold -> false
< intros E. Subgoal 1.6.2.1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) E : L = Hold ============================ false
< case E. Subgoal 1.6.2.1: Variables: Hold Copy FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false LL : lookupScopes Hold EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes Hold (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) ============================ false
< backchain NEqHL. Subgoal 1.6.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) H1 : L = Hold -> false ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< LH': apply replaceScopes_lookupScopes_other to RSL LH _. Subgoal 1.6.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal Fields) H1 : L = Hold -> false LH' : lookupScopes Hold EE' (recVal HFs) ============================ Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
< apply lookupScopes_unique to L1 LH'. Subgoal 1.6.2: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup HFs "tail" V3 L : no_lookup [(Copy, recVal NewVals)] Hold L1 : lookupScopes Hold EE' (recVal HFs) H1 : L = Hold -> false LH' : lookupScopes Hold EE' (recVal HFs) ============================ HFs = HFs /\ lookupScopes Hold EE' (recVal HFs)
< search. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup Fields "tail" V3 LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields) Eq : Fields = HFs /\ lookupScopes Hold EE' (recVal HFs) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LH': case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup HFs "tail" V3 LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal HFs) LH' : lookupScopes Hold EE' (recVal HFs) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear LH+. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Eq: assert exists EE'', (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE' EE''. Subgoal 1.7: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) ============================ exists EE'', (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE' EE''
< RS: case EvH1. Subgoal 1.7.1: Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE2 EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE2 (recVal HFs) RS : mem (Hold, I) [(Copy, recVal NewVals)] RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain ============================ exists EE'', ((Hold, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE2 EE''
< M: case RS. Subgoal 1.7.1.1: Variables: Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Copy = L -> false NEqCH : Copy = Copy -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Copy EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Copy))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Copy (tail (name Copy))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE2 EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Copy EE2 (recVal HFs) RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain ============================ exists EE'', ((Copy, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Copy V3 EE2 EE''
< apply NEqCH to _. Subgoal 1.7.1.2: Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 I LRemain IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE2 EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE2 (recVal HFs) RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain M : mem (Hold, I) [] ============================ exists EE'', ((Hold, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE2 EE''
< case M. Subgoal 1.7.2: Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : replaceScopes Hold V3 EE' EE2 ============================ exists EE'', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE' EE''
< search. Subgoal 1: Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2) EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) Eq : exists EE'', (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\ replaceScopes Hold V3 EE' EE'' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< RSH: case Eq. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') ([(Copy, recVal NewVals)]::EE'') EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< clear EvH1. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LL': apply replaceScopes_lookupScopes to RSL. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LL'': apply replaceScopes_lookupScopes_other to RSH LL' _. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) LL'' : lookupScopes L EE'' (recVal NewVals) ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< LH'': apply replaceScopes_lookupScopes to RSH. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) LL'' : lookupScopes L EE'' (recVal NewVals) LH'' : lookupScopes Hold EE'' V3 ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< Sub: apply IH to Ev2 NEqHL NEqCH NEqCL LL'' LH''. Subgoal 1: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal EvA2 : updateRecFields ["tail"] LVal HFs NewVals RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) LL'' : lookupScopes L EE'' (recVal NewVals) LH'' : lookupScopes Hold EE'' V3 Sub : listy V3 Sub1 : flipOnto V3 (recVal NewVals) LV ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< URF: case EvA2. Subgoal 1.8: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) LL'' : lookupScopes L EE'' (recVal NewVals) LH'' : lookupScopes Hold EE'' V3 Sub : listy V3 Sub1 : flipOnto V3 (recVal NewVals) LV URF : replaceRecVal "tail" LVal HFs NewVals ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< search. Subgoal 1.9: Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV Fields1 Updated IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L EE6 LVal LH : lookupScopes Hold EE6 (recVal HFs) Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 * EvC1 : lookup HFs "null" falseVal RSL : replaceScopes L (recVal NewVals) EE6 EE' EvH2 : lookup HFs "tail" V3 LH' : lookupScopes Hold EE' (recVal HFs) RSH : replaceScopes Hold V3 EE' EE'' LL' : lookupScopes L EE' (recVal NewVals) LL'' : lookupScopes L EE'' (recVal NewVals) LH'' : lookupScopes Hold EE'' V3 Sub : listy V3 Sub1 : flipOnto V3 (recVal NewVals) LV URF : lookup HFs "tail" (recVal Fields1) URF1 : updateRecFields [] LVal Fields1 Updated URF2 : replaceRecVal "tail" (recVal Updated) HFs NewVals ============================ exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
< case URF1. Subgoal 2: Variables: Hold Copy L FE G G' O LVal HVal IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev : evalExpr FE G (not (null (name Hold))) falseVal G' O * ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< Ev: case Ev. Subgoal 2: Variables: Hold Copy L FE G G' O LVal HVal IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev : evalExpr FE G (null (name Hold)) trueVal G' O * ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< Ev: case Ev. Subgoal 2: Variables: Hold Copy L FE G G' O LVal HVal Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G LVal LH : lookupScopes Hold G HVal Ev : evalExpr FE G (name Hold) (recVal Fields) G' O * Ev1 : lookup Fields "null" trueVal ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< L: case Ev. Subgoal 2: Variables: Hold Copy L FE G' LVal HVal Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G' LVal LH : lookupScopes Hold G' HVal Ev1 : lookup Fields "null" trueVal L : lookupScopes Hold G' (recVal Fields) ============================ exists LV, listy HVal /\ flipOnto HVal LVal LV
< apply lookupScopes_unique to LH L. Subgoal 2: Variables: Hold Copy L FE G' LVal Fields IH : forall Hold Copy L FE G G' O LVal HVal, evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * -> (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal -> lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV NEqHL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false LL : lookupScopes L G' LVal LH : lookupScopes Hold G' (recVal Fields) Ev1 : lookup Fields "null" trueVal L : lookupScopes Hold G' (recVal Fields) ============================ exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
< search. Proof completed.
< Theorem replaceRecVal_other_val : forall F VA L R VB, replaceRecVal F VA L R -> exists R', replaceRecVal F VB L R'. ============================ forall F VA L R VB, replaceRecVal F VA L R -> exists R', replaceRecVal F VB L R'
< induction on 1. IH : forall F VA L R VB, replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R' ============================ forall F VA L R VB, replaceRecVal F VA L R @ -> exists R', replaceRecVal F VB L R'
< intros R. Variables: F VA L R VB IH : forall F VA L R VB, replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R' R : replaceRecVal F VA L R @ ============================ exists R', replaceRecVal F VB L R'
< R: case R. Subgoal 1: Variables: F VA VB Rest VOld IH : forall F VA L R VB, replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R' ============================ exists R', replaceRecVal F VB ((F, VOld)::Rest) R'
< search. Subgoal 2: Variables: F VA VB RRest VO O Rest IH : forall F VA L R VB, replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R' R : F = O -> false R1 : replaceRecVal F VA Rest RRest * ============================ exists R', replaceRecVal F VB ((O, VO)::Rest) R'
< apply IH to R1 with VB = VB. Subgoal 2: Variables: F VA VB RRest VO O Rest R' IH : forall F VA L R VB, replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R' R : F = O -> false R1 : replaceRecVal F VA Rest RRest * H1 : replaceRecVal F VB Rest R' ============================ exists R', replaceRecVal F VB ((O, VO)::Rest) R'
< search. Proof completed.
< Theorem proj_eval_listUpdate : forall OldL VI (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL. ============================ forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< induction on 15. IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL ============================ forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 @ -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< intros NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE IsG+ IsCopy LS EvW EvNL EvA. Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvW : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 @ EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvW: case EvW. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is: case IsG+ (keep). Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is: case Is. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, HoldL) Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Is. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] H1 : is_string Hold H2 : is_value HoldL ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is: case Is2. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_pair is_string is_value (SaveI, VI) Is2 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is: case Is. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is2 : is_list (is_pair is_string is_value) [(SaveE, V)] Is : is_string SaveI Is3 : is_value VI ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is: case Is2. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI Is2 : is_pair is_string is_value (SaveE, V) Is4 : is_list (is_pair is_string is_value) [] ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Is2. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI Is4 : is_list (is_pair is_string is_value) [] H3 : is_string SaveE H4 : is_value V ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Is4. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< apply lookupScopes_is to _ LS. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< apply evalExpr_isCtx to _ _ _ EvW. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Is++: apply evalStmt_isCtx to _ _ _ EvW1. Subgoal 1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
< search 20. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 * EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvC: case EvW. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE3 O6 * EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * EvC2 : O6 ++ O7 = O3 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< clear EvC2. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE3 O6 * EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvC: case EvC. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal EE3 O6 * ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvC: case EvC. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 EE4 O8 V2 O9 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE4 O8 * EvC2 : evalExpr FE EE4 (num 0) V2 EE3 O9 * EvC3 : V1 = V2 -> false EvC4 : O8 ++ O9 = O6 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case EvC2. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 O8 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE3 O8 * EvC3 : V1 = intVal 0 -> false EvC4 : O8 ++ [] = O6 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< clear EvC4. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 O8 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 * EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE3 O8 * EvC3 : V1 = intVal 0 -> false ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< LC: case EvC. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Eq: assert V1 = VI. Subgoal 1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 ============================ V1 = VI
< LS: case LC. Subgoal 1.2.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LS1 : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI V1 ============================ V1 = VI
< L: case LS1. Subgoal 1.2.1.1: Variables: OldL VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : SaveI = SaveI -> false NEqHL : SaveI = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : SaveI = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = SaveI -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, V1), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string SaveI H2 : is_value V1 Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(SaveI, V1), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false ============================ V1 = VI
< apply NEqHI to _. Subgoal 1.2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false L : Hold = SaveI -> false L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI V1 ============================ V1 = VI
< L: case L1. Subgoal 1.2.1.2.1: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, V1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value V1 H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, V1), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false L : Hold = SaveI -> false ============================ V1 = V1
< search. Subgoal 1.2.1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false L : Hold = SaveI -> false L1 : SaveI = SaveI -> false L2 : lookup [(SaveE, V)] SaveI V1 ============================ V1 = VI
< L: case L2. Subgoal 1.2.1.2.2.1: Variables: OldL VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, V1)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveI H4 : is_value V1 H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveI, V1)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false L : Hold = SaveI -> false L1 : SaveI = SaveI -> false ============================ V1 = VI
< apply L1 to _. Subgoal 1.2.1.2.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false L : Hold = SaveI -> false L1 : SaveI = SaveI -> false L2 : SaveE = SaveI -> false L3 : lookup [] SaveI V1 ============================ V1 = VI
< case L3. Subgoal 1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI LS2 : lookupScopes SaveI G V1 ============================ V1 = VI
< N: case LS1. Subgoal 1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LS2 : lookupScopes SaveI G V1 N : Hold = SaveI -> false N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI ============================ V1 = VI
< N: case N1. Subgoal 1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LS2 : lookupScopes SaveI G V1 N : Hold = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [(SaveE, V)] SaveI ============================ V1 = VI
< apply N1 to _. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : V1 = intVal 0 -> false LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 Eq : V1 = VI ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Eq. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * EvW3 : O3 ++ O4 = O12 EvW4 : O12 ++ O5 = O1 Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * EvC3 : VI = intVal 0 -> false LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) VI ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< clear LC EvC3 EvW4 EvW3. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 * ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvC: case EvC1. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal EE1 O7 * ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< EvC: case EvC. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) EE1 Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name L) (recVal Fields) EE1 O7 * EvC1 : lookup Fields "null" falseVal ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< LC: case EvC. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Eq: assert OldL = recVal Fields. Subgoal 1.3: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) ============================ OldL = recVal Fields
< L: case LC. Subgoal 1.3.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L (recVal Fields) ============================ OldL = recVal Fields
< L: case L. Subgoal 1.3.1.1: Variables: OldL VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string L H2 : is_value (recVal Fields) Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal ============================ OldL = recVal Fields
< apply NEqHL to _. Subgoal 1.3.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : lookup [(SaveI, VI), (SaveE, V)] L (recVal Fields) ============================ OldL = recVal Fields
< L: case L1. Subgoal 1.3.1.2.1: Variables: OldL Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = L -> false NEqHL : Hold = L -> false NEqIE : L = SaveE -> false NEqIL : L = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : L = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G)) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string L Is3 : is_value (recVal Fields) H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : Hold = L -> false ============================ OldL = recVal Fields
< apply NEqIL to _. Subgoal 1.3.1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false L2 : lookup [(SaveE, V)] L (recVal Fields) ============================ OldL = recVal Fields
< L: case L2. Subgoal 1.3.1.2.2.1: Variables: OldL VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string L H4 : is_value (recVal Fields) H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false ============================ OldL = recVal Fields
< apply NEqEL to _. Subgoal 1.3.1.2.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false L2 : SaveE = L -> false L3 : lookup [] L (recVal Fields) ============================ OldL = recVal Fields
< case L3. Subgoal 1.3.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L L1 : lookupScopes L G (recVal Fields) ============================ OldL = recVal Fields
< apply lookupScopes_unique to LS L1. Subgoal 1.3.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L L1 : lookupScopes L G (recVal Fields) ============================ recVal Fields = recVal Fields
< search. Subgoal 1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value OldL H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) Eq : OldL = recVal Fields ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Eq. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear LC. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 * EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvB: case EvW1. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 * EvB1 : evalStmt FE EE5 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) (Scope::EE2) O11 * EvB2 : O10 ++ O11 = O4 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvB: case EvB1. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 * EvB2 : O10 ++ O11 = O4 EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) (Scope::EE2) O14 * EvB4 : O13 ++ O14 = O11 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvB: case EvB3. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 * EvB2 : O10 ++ O11 = O4 EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB4 : O13 ++ O14 = O11 EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) (Scope::EE2) O16 * EvB6 : O15 ++ O16 = O14 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvB: case EvB5. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 * EvB2 : O10 ++ O11 = O4 EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB4 : O13 ++ O14 = O11 EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB6 : O15 ++ O16 = O14 EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvB8 : O17 ++ O18 = O16 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear EvB8 EvB4 EvB2 EvB6. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 * EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvX: case EvB. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 V3 EE9 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V3 EE9 O10 * EvX1 : replaceScopes SaveI V3 EE9 EE5 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvX: case EvX. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 EE10 O19 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (name SaveI) (intVal I1) EE10 O19 * EvX2 : evalExpr FE EE10 (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I EvX4 : O19 ++ O20 = O10 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< LI: case EvX. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I EvX4 : [] ++ O20 = O10 LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1) ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear EvX4. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1) ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< Eq: assert VI = intVal I1. Subgoal 1.4: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1) ============================ VI = intVal I1
< LS: case LI. Subgoal 1.4.1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : lookup [] SaveI (intVal I1) ============================ VI = intVal I1
< case LS1. Subgoal 1.4.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI LS2 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (intVal I1) ============================ VI = intVal I1
< LS': case LS2. Subgoal 1.4.2.1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI LS' : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI (intVal I1) ============================ VI = intVal I1
< L: case LS'. Subgoal 1.4.2.1.1: Variables: VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : SaveI = SaveI -> false NEqHL : SaveI = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : SaveI = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = SaveI -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string SaveI H2 : is_value (intVal I1) Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name SaveI)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign SaveI (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI ============================ VI = intVal I1
< apply NEqHI to _. Subgoal 1.4.2.1.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI L : Hold = SaveI -> false L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI (intVal I1) ============================ VI = intVal I1
< L: case L1. Subgoal 1.4.2.1.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI L : Hold = SaveI -> false ============================ intVal I1 = intVal I1
< search. Subgoal 1.4.2.1.2.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI L : Hold = SaveI -> false L1 : SaveI = SaveI -> false L2 : lookup [(SaveE, V)] SaveI (intVal I1) ============================ VI = intVal I1
< L: case L2. Subgoal 1.4.2.1.2.2.1: Variables: VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveI H4 : is_value (intVal I1) H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI L : Hold = SaveI -> false L1 : SaveI = SaveI -> false ============================ VI = intVal I1
< apply L1 to _. Subgoal 1.4.2.1.2.2.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI L : Hold = SaveI -> false L1 : SaveI = SaveI -> false L2 : SaveE = SaveI -> false L3 : lookup [] SaveI (intVal I1) ============================ VI = intVal I1
< case L3. Subgoal 1.4.2.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI LS' : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI LS'1 : lookupScopes SaveI G (intVal I1) ============================ VI = intVal I1
< N: case LS'. Subgoal 1.4.2.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI LS'1 : lookupScopes SaveI G (intVal I1) N : Hold = SaveI -> false N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI ============================ VI = intVal I1
< N: case N1. Subgoal 1.4.2.2: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LS1 : no_lookup [] SaveI LS'1 : lookupScopes SaveI G (intVal I1) N : Hold = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [(SaveE, V)] SaveI ============================ VI = intVal I1
< apply N1 to _. Subgoal 1: Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value VI H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1) Eq : VI = intVal I1 ============================ exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (intVal I1) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear LI. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) EE9 EE5 EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 * EvX3 : I1 - I2 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< case EvX2. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5 EvX3 : I1 - 1 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< rename EvX3 to Minus. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5 Minus : I1 - 1 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< Eq: assert EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G). Subgoal 1.5: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5 Minus : I1 - 1 = I ============================ EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RS: case EvX1. Subgoal 1.5.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE (((SaveI, intVal I)::LRemain)::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : mem (SaveI, I3) [] RS1 : remove_all [] SaveI LRemain ============================ ((SaveI, intVal I)::LRemain)::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< case RS. Subgoal 1.5.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::New) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS1 : replaceScopes SaveI (intVal I) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) New ============================ []::New = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RS': case RS1. Subgoal 1.5.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::LRemain)::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RS'1 : remove_all [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] SaveI LRemain ============================ []::(((SaveI, intVal I)::LRemain)::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RA: case RS'1. Subgoal 1.5.2.1.1: Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : SaveI = SaveI -> false NEqHL : SaveI = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : SaveI = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = SaveI -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string SaveI H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::LRemain)::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name SaveI)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign SaveI (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : remove_all [(SaveI, intVal I1), (SaveE, V)] SaveI LRemain ============================ []::(((SaveI, intVal I)::LRemain)::G) = []::([(SaveI, intVal I), (SaveI, HoldL), (SaveE, V)]::G)
< apply NEqHI to _. Subgoal 1.5.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : Hold = SaveI -> false RA1 : remove_all [(SaveI, intVal I1), (SaveE, V)] SaveI R ============================ []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RA: case RA1. Subgoal 1.5.2.1.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : Hold = SaveI -> false RA1 : remove_all [(SaveE, V)] SaveI R ============================ []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RA: case RA1. Subgoal 1.5.2.1.2.1.1: Variables: Hold SaveI Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveI H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)] RA : Hold = SaveI -> false RA1 : remove_all [] SaveI R ============================ []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveI, V)]::G)
< apply NEqIE to _. Subgoal 1.5.2.1.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::((SaveE, V)::R1)))::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : Hold = SaveI -> false RA1 : SaveE = SaveI -> false RA2 : remove_all [] SaveI R1 ============================ []::(((SaveI, intVal I)::((Hold, HoldL)::((SaveE, V)::R1)))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< case RA2. Subgoal 1.5.2.1.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : Hold = SaveI -> false RA1 : SaveE = SaveI -> false ============================ []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< search. Subgoal 1.5.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::((SaveI, intVal I1)::R1)))::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] RA : Hold = SaveI -> false RA1 : SaveI = SaveI -> false RA2 : remove_all [(SaveE, V)] SaveI R1 ============================ []::(((SaveI, intVal I)::((Hold, HoldL)::((SaveI, intVal I1)::R1)))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply RA1 to _. Subgoal 1.5.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS' : no_lookup [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] SaveI RS'1 : replaceScopes SaveI (intVal I) G New1 ============================ []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case RS'. Subgoal 1.5.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS'1 : replaceScopes SaveI (intVal I) G New1 N : Hold = SaveI -> false N1 : no_lookup [(SaveI, intVal I1), (SaveE, V)] SaveI ============================ []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case N1. Subgoal 1.5.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I RS : no_lookup [] SaveI RS'1 : replaceScopes SaveI (intVal I) G New1 N : Hold = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [(SaveE, V)] SaveI ============================ []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply N1 to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5 Minus : I1 - 1 = I Eq : EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) Minus : I1 - 1 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear EvX1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 * EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvX: case EvB1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 * ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< Eq: assert (V4 = recVal Fields /\ Scope1 = []) /\ EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G. Subgoal 1.6: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 * ============================ (V4 = recVal Fields /\ Scope1 = []) /\ EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case EvX. Subgoal 1.6: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : lookupScopes L ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case L. Subgoal 1.6.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : lookup [] L V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< case L. Subgoal 1.6.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : lookupScopes L ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case L1. Subgoal 1.6.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case L1. Subgoal 1.6.2.1.1: Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = L -> false NEqHL : Hold = L -> false NEqIE : L = SaveE -> false NEqIL : L = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : L = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string L Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, intVal I)]::([(L, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L ============================ (intVal I = recVal Fields /\ [] = []) /\ [(L, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(L, intVal I), (Hold, HoldL), (SaveE, V)]::G
< apply NEqIL to _. Subgoal 1.6.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : SaveI = L -> false L2 : lookup [(Hold, HoldL), (SaveE, V)] L V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case L2. Subgoal 1.6.2.1.2.1: Variables: SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, V4), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string L H2 : is_value V4 Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(L, V4), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (L, V4), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign L (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : SaveI = L -> false ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (L, V4), (SaveE, V)]::G = [(SaveI, intVal I), (L, V4), (SaveE, V)]::G
< apply NEqHL to _. Subgoal 1.6.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : SaveI = L -> false L2 : Hold = L -> false L3 : lookup [(SaveE, V)] L V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< L: case L3. Subgoal 1.6.2.1.2.2.1: Variables: Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, V4)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string L H4 : is_value V4 H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, V4)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : SaveI = L -> false L2 : Hold = L -> false ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G = [(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G
< apply NEqEL to _. Subgoal 1.6.2.1.2.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : SaveI = L -> false L2 : Hold = L -> false L3 : SaveE = L -> false L4 : lookup [] L V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< case L4. Subgoal 1.6.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L L2 : lookupScopes L G V4 ============================ (V4 = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< apply lookupScopes_unique to L2 LS. Subgoal 1.6.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I L : no_lookup [] L L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L L2 : lookupScopes L G (recVal Fields) ============================ (recVal Fields = recVal Fields /\ [] = []) /\ [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 * Eq : (V4 = recVal Fields /\ Scope1 = []) /\ EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) (recVal Fields) ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O13 * ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< clear EvX. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 * EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< EvRC: case EvB3. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< Eq: assert Fields = FieldVals. Subgoal 1.7: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ Fields = FieldVals
< L: case EvRC1. Subgoal 1.7.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 L : lookup [(Copy, recVal Fields)] Copy (recVal FieldVals) ============================ Fields = FieldVals
< L: case L. Subgoal 1.7.1.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ FieldVals = FieldVals
< search. Subgoal 1.7.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 L : Copy = Copy -> false L1 : lookup [] Copy (recVal FieldVals) ============================ Fields = FieldVals
< case L1. Subgoal 1.7.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 L : no_lookup [(Copy, recVal Fields)] Copy L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) (recVal FieldVals) ============================ Fields = FieldVals
< N: case L. Subgoal 1.7.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) (recVal FieldVals) N : Copy = Copy -> false N1 : no_lookup [] Copy ============================ Fields = FieldVals
< apply N to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal Fields) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal Fields) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup Fields "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 Eq : Fields = FieldVals ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC1 : lookupScopes Copy ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvRC1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert V5 = HoldL /\ EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G). Subgoal 1.8: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 ============================ V5 = HoldL /\ EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< EvH: case EvRC. Subgoal 1.8: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 EvH : lookupScopes Hold ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case EvH. Subgoal 1.8.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : lookup [(Copy, recVal FieldVals)] Hold V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case L. Subgoal 1.8.1.1: Variables: Hold SaveI SaveE L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Hold = Hold -> false NEqCL : Hold = L -> false NEqIC : SaveI = Hold -> false NEqEC : SaveE = Hold -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Hold LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Hold)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] (recVal FieldVals) FieldVals NewVals EvRC3 : replaceScopes Hold (recVal NewVals) ([(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 ============================ recVal FieldVals = HoldL /\ [(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply NEqCH to _. Subgoal 1.8.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : Copy = Hold -> false L1 : lookup [] Hold V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< case L1. Subgoal 1.8.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : lookupScopes Hold ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case L1. Subgoal 1.8.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case L1. Subgoal 1.8.2.1.1: Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name Hold) (num 0))) (not (null (name L)))) (seq (assign Hold (minus (name Hold) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string Hold Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] (intVal I) FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold ============================ intVal I = HoldL /\ [(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply NEqHI to _. Subgoal 1.8.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : SaveI = Hold -> false L2 : lookup [(Hold, HoldL), (SaveE, V)] Hold V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case L2. Subgoal 1.8.2.1.2.1: Variables: Hold SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, V5), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value V5 Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, V5), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : SaveI = Hold -> false ============================ V5 = V5 /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G)
< search. Subgoal 1.8.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : SaveI = Hold -> false L2 : Hold = Hold -> false L3 : lookup [(SaveE, V)] Hold V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply L2 to _. Subgoal 1.8.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold L2 : lookupScopes Hold G V5 ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case L1. Subgoal 1.8.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L2 : lookupScopes Hold G V5 N : SaveI = Hold -> false N1 : no_lookup [(Hold, HoldL), (SaveE, V)] Hold ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case N1. Subgoal 1.8.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 L : no_lookup [(Copy, recVal FieldVals)] Hold L2 : lookupScopes Hold G V5 N : SaveI = Hold -> false N1 : Hold = Hold -> false N2 : no_lookup [(SaveE, V)] Hold ============================ V5 = HoldL /\ [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply N1 to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 * EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7 Eq : V5 = HoldL /\ EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O15 * EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvRC. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G). Subgoal 1.9: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 ============================ EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RS: case EvRC3. Subgoal 1.9.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : mem (Copy, I3) [(Copy, recVal FieldVals)] RS1 : remove_all [(Copy, recVal FieldVals)] Copy LRemain ============================ ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< RA: case RS1. Subgoal 1.9.1.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : mem (Copy, I3) [(Copy, recVal FieldVals)] RA : remove_all [] Copy LRemain ============================ ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< case RA. Subgoal 1.9.1.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : mem (Copy, I3) [(Copy, recVal FieldVals)] ============================ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< search. Subgoal 1.9.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE (((Copy, recVal NewVals)::((Copy, recVal FieldVals)::R))::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : mem (Copy, I3) [(Copy, recVal FieldVals)] RA : Copy = Copy -> false RA1 : remove_all [] Copy R ============================ ((Copy, recVal NewVals)::((Copy, recVal FieldVals)::R))::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply RA to _. Subgoal 1.9.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE ([(Copy, recVal FieldVals)]::New) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal FieldVals)] Copy RS1 : replaceScopes Copy (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New ============================ [(Copy, recVal FieldVals)]::New = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case RS. Subgoal 1.9.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE ([(Copy, recVal FieldVals)]::New) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS1 : replaceScopes Copy (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New N : Copy = Copy -> false N1 : no_lookup [] Copy ============================ [(Copy, recVal FieldVals)]::New = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply N to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7 Eq : EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvRC3. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 * EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< EvHC: case EvB5. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 * EvHC1 : replaceScopes Hold V6 EE13 EE8 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert V6 = recVal NewVals /\ EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G). Subgoal 1.10: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 * EvHC1 : replaceScopes Hold V6 EE13 EE8 ============================ V6 = recVal NewVals /\ EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< E: case EvHC. Subgoal 1.10: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 E : lookupScopes Copy ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V6 ============================ V6 = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case E. Subgoal 1.10.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 L : lookup [(Copy, recVal NewVals)] Copy V6 ============================ V6 = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< L: case L. Subgoal 1.10.1.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 ============================ recVal NewVals = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< search. Subgoal 1.10.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 L : Copy = Copy -> false L1 : lookup [] Copy V6 ============================ V6 = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply L to _. Subgoal 1.10.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 L : no_lookup [(Copy, recVal NewVals)] Copy L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V6 ============================ V6 = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< N: case L. Subgoal 1.10.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V6 N : Copy = Copy -> false N1 : no_lookup [] Copy ============================ V6 = recVal NewVals /\ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
< apply N to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 * EvHC1 : replaceScopes Hold V6 EE13 EE8 Eq : V6 = recVal NewVals /\ EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O17 * EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvHC. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G). Subgoal 1.11: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 ============================ EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< RS: case EvHC1. Subgoal 1.11.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE (((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : mem (Hold, I3) [(Copy, recVal NewVals)] RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain ============================ ((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< M: case RS. Subgoal 1.11.1.1: Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Copy = SaveI -> false NEqHL : Copy = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Copy = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Copy -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Copy H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Copy, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Copy, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain ============================ ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Copy, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Copy, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< apply NEqCH to _. Subgoal 1.11.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE (((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain M : mem (Hold, I3) [] ============================ ((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< case M. Subgoal 1.11.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::New) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : replaceScopes Hold (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New ============================ [(Copy, recVal NewVals)]::New = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< RS: case RS1. Subgoal 1.11.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RS2 : remove_all [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold LRemain ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< RA: case RS2. Subgoal 1.11.2.1.1: Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = Hold -> false NEqHL : Hold = L -> false NEqIE : Hold = SaveE -> false NEqIL : Hold = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : Hold = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name Hold) (num 0))) (not (null (name L)))) (seq (assign Hold (minus (name Hold) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string Hold Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(Hold, intVal I), (Hold, HoldL), (SaveE, V)] RA : remove_all [(Hold, HoldL), (SaveE, V)] Hold LRemain ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (Hold, intVal I), (SaveE, V)]::G)
< apply NEqHI to _. Subgoal 1.11.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RA : SaveI = Hold -> false RA1 : remove_all [(Hold, HoldL), (SaveE, V)] Hold R ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< RA: case RA1. Subgoal 1.11.2.1.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RA : SaveI = Hold -> false RA1 : remove_all [(SaveE, V)] Hold R ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< RA: case RA1. Subgoal 1.11.2.1.2.1.1: Variables: Hold SaveI Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Hold -> false NEqIL : SaveI = L -> false NEqHE : Hold = Hold -> false NEqEL : Hold = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : Hold = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (Hold, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name Hold)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string Hold H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (Hold, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (Hold, V)] RA : SaveI = Hold -> false RA1 : remove_all [] Hold R ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (Hold, V)]::G)
< apply NEqHE to _. Subgoal 1.11.2.1.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((SaveE, V)::R1)))::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RA : SaveI = Hold -> false RA1 : SaveE = Hold -> false RA2 : remove_all [] Hold R1 ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((SaveE, V)::R1)))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< case RA2. Subgoal 1.11.2.1.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RA : SaveI = Hold -> false RA1 : SaveE = Hold -> false ============================ [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< search. Subgoal 1.11.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((Hold, HoldL)::R1)))::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] RA : SaveI = Hold -> false RA1 : Hold = Hold -> false RA2 : remove_all [(SaveE, V)] Hold R1 ============================ [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((Hold, HoldL)::R1)))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< apply RA1 to _. Subgoal 1.11.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold RS2 : replaceScopes Hold (recVal NewVals) G New1 ============================ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< N: case RS1. Subgoal 1.11.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS2 : replaceScopes Hold (recVal NewVals) G New1 N : SaveI = Hold -> false N1 : no_lookup [(Hold, HoldL), (SaveE, V)] Hold ============================ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< N: case N1. Subgoal 1.11.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals RS : no_lookup [(Copy, recVal NewVals)] Hold RS2 : replaceScopes Hold (recVal NewVals) G New1 N : SaveI = Hold -> false N1 : Hold = Hold -> false N2 : no_lookup [(SaveE, V)] Hold ============================ [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
< apply N1 to _. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8 Eq : EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvHC1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 * Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< EvB: case EvB7. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals V7 EE14 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB : evalExpr FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (tail (name L)) V7 EE14 O18 * EvB1 : replaceScopes L V7 EE14 (Scope::EE2) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Ev: case EvB. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals V7 EE14 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 EE14 (Scope::EE2) Ev : evalExpr FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (name L) (recVal Fields1) EE14 O18 * Ev1 : lookup Fields1 "tail" V7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< LSL: case Ev. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert Fields1 = FieldVals. Subgoal 1.12: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1) ============================ Fields1 = FieldVals
< LSL: case LSL. Subgoal 1.12.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : lookup [(Copy, recVal NewVals)] L (recVal Fields1) ============================ Fields1 = FieldVals
< L: case LSL. Subgoal 1.12.1.1: Variables: Hold SaveI SaveE L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : L = Hold -> false NEqCL : L = L -> false NEqIC : SaveI = L -> false NEqEC : SaveE = L -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string L LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals Fields1 EvB1 : replaceScopes L V7 ([(L, recVal Fields1)]::([(Hold, recVal Fields1), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 ============================ Fields1 = FieldVals
< apply NEqCL to _. Subgoal 1.12.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 L : Copy = L -> false L1 : lookup [] L (recVal Fields1) ============================ Fields1 = FieldVals
< case L1. Subgoal 1.12.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L LSL1 : lookupScopes L ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields1) ============================ Fields1 = FieldVals
< LS': case LSL1. Subgoal 1.12.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L LS' : lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L (recVal Fields1) ============================ Fields1 = FieldVals
< L: case LS'. Subgoal 1.12.2.1.1: Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string L H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(L, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals Fields1 EvB1 : replaceScopes L V7 ([(Copy, recVal Fields1)]::([(L, recVal Fields1), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal Fields1)] L ============================ Fields1 = FieldVals
< apply NEqHL to _. Subgoal 1.12.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L L : Hold = L -> false L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields1) ============================ Fields1 = FieldVals
< L: case L1. Subgoal 1.12.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L L : Hold = L -> false L1 : SaveI = L -> false L2 : lookup [(SaveE, V)] L (recVal Fields1) ============================ Fields1 = FieldVals
< L: case L2. Subgoal 1.12.2.1.2.1: Variables: Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, recVal Fields1)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string L H4 : is_value (recVal Fields1) H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, recVal Fields1)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (L, recVal Fields1)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L L : Hold = L -> false L1 : SaveI = L -> false ============================ Fields1 = FieldVals
< apply NEqEL to _. Subgoal 1.12.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L L : Hold = L -> false L1 : SaveI = L -> false L2 : SaveE = L -> false L3 : lookup [] L (recVal Fields1) ============================ Fields1 = FieldVals
< case L3. Subgoal 1.12.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L LS' : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LS'1 : lookupScopes L G (recVal Fields1) ============================ Fields1 = FieldVals
< apply lookupScopes_unique to LS'1 LS. Subgoal 1.12.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup FieldVals "tail" V7 LSL : no_lookup [(Copy, recVal NewVals)] L LS' : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LS'1 : lookupScopes L G (recVal FieldVals) ============================ FieldVals = FieldVals
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup Fields1 "tail" V7 LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1) Eq : Fields1 = FieldVals ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup FieldVals "tail" V7 LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal FieldVals) ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear LSL. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup FieldVals "tail" V7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert exists G', (Scope = [(Copy, recVal NewVals)] /\ EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7. Subgoal 1.13: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup FieldVals "tail" V7 ============================ exists G', (Scope = [(Copy, recVal NewVals)] /\ EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< RS: case EvB1. Subgoal 1.13.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (((L, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : mem (L, I3) [(Copy, recVal NewVals)] RS1 : remove_all [(Copy, recVal NewVals)] L LRemain ============================ exists G', ((L, V7)::LRemain = [(Copy, recVal NewVals)] /\ [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< M: case RS. Subgoal 1.13.1.1: Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = Copy -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Copy -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Copy -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Copy -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes Copy G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name Copy)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate Copy ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string Copy H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (((Copy, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain ============================ exists G', ((Copy, V7)::LRemain = [(Copy, recVal NewVals)] /\ [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes Copy G' V7
< apply NEqCL to _. Subgoal 1.13.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (((L, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS1 : remove_all [(Copy, recVal NewVals)] L LRemain M : mem (L, I3) [] ============================ exists G', ((L, V7)::LRemain = [(Copy, recVal NewVals)] /\ [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< case M. Subgoal 1.13.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS1 : replaceScopes L V7 ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) EE2 ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< RS: case RS1. Subgoal 1.13.2.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS1 : mem (L, I3) [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< M: case RS1. Subgoal 1.13.2.1.1: Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes Hold G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name Hold)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate Hold ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((Hold, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string Hold H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((Hold, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] Hold RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] Hold LRemain ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((Hold, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes Hold G' V7
< apply NEqHL to _. Subgoal 1.13.2.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain M : mem (L, I3) [(SaveI, intVal I), (SaveE, V)] ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< M: case M. Subgoal 1.13.2.1.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes SaveI G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name SaveI)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate SaveI ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((SaveI, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string SaveI H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((SaveI, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] SaveI RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] SaveI LRemain ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((SaveI, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes SaveI G' V7
< apply NEqIL to _. Subgoal 1.13.2.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain M : mem (L, I3) [(SaveE, V)] ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< M: case M. Subgoal 1.13.2.1.2.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes SaveE G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name SaveE)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate SaveE ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((SaveE, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string SaveE H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((SaveE, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] SaveE RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] SaveE LRemain ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((SaveE, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes SaveE G' V7
< apply NEqEL to _. Subgoal 1.13.2.1.2.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain M : mem (L, I3) [] ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< case M. Subgoal 1.13.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS1 : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L RS2 : replaceScopes L V7 G New ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< apply replaceScopes_lookupScopes to RS2. Subgoal 1.13.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New)) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 RS : no_lookup [(Copy, recVal NewVals)] L RS1 : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L RS2 : replaceScopes L V7 G New H8 : lookupScopes L New V7 ============================ exists G', ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7
< search. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2) Ev1 : lookup FieldVals "tail" V7 Eq : exists G', (Scope = [(Copy, recVal NewVals)] /\ EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\ lookupScopes L G' V7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< LS': case Eq. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G' IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G')) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G')) Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvB1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G' IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G')) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Is++. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G' IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< ULI: apply IH to NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE _ IsCopy LS' EvW2 _ EvA. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< RRV: assert replaceRecVal "tail" HoldL FieldVals NewVals. Subgoal 1.14: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL ============================ replaceRecVal "tail" HoldL FieldVals NewVals
< RRV: case EvRC2. Subgoal 1.14.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL RRV : replaceRecVal "tail" HoldL FieldVals NewVals ============================ replaceRecVal "tail" HoldL FieldVals NewVals
< search. Subgoal 1.14.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL Fields2 Updated IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL RRV : lookup FieldVals "tail" (recVal Fields2) RRV1 : updateRecFields [] HoldL Fields2 Updated RRV2 : replaceRecVal "tail" (recVal Updated) FieldVals NewVals ============================ replaceRecVal "tail" HoldL FieldVals NewVals
< case RRV1. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL RRV : replaceRecVal "tail" HoldL FieldVals NewVals ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< RRV': apply replaceRecVal_other_val to RRV with VB = NewL. Subgoal 1: Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL R' IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 * Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_string Hold H2 : is_value HoldL Is : is_string SaveI Is3 : is_value (intVal I1) H3 : is_string SaveE H4 : is_value V H5 : is_value (recVal FieldVals) H6 : is_string L H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) EvC1 : lookup FieldVals "null" falseVal Minus : I1 - 1 = I3 EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals Ev1 : lookup FieldVals "tail" V7 LS' : lookupScopes L G' V7 H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)] H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') ULI : updateListIndex V7 I3 V NewL RRV : replaceRecVal "tail" HoldL FieldVals NewVals RRV' : replaceRecVal "tail" NewL FieldVals R' ============================ exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< search. Subgoal 2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 * ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< Eq: assert VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G. Subgoal 2.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 * ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvC: case EvW. Subgoal 2.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) falseVal G1 O1 * ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvC: case EvC. Subgoal 2.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) trueVal G1 O1 * ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvC: case EvC. Subgoal 2.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 V1 EE1 O3 O4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE1 O3 * EvC1 : evalExpr FE EE1 (num 0) V1 G1 O4 * EvC2 : O3 ++ O4 = O1 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< case EvC1. Subgoal 2.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) (intVal 0) G1 O3 * EvC2 : O3 ++ [] = O1 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< L: case EvC. Subgoal 2.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (intVal 0) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< L: case L. Subgoal 2.1.1.1: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI (intVal 0) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< L: case L. Subgoal 2.1.1.1.1: Variables: OldL VI SaveI SaveE Copy L V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : SaveI = SaveI -> false NEqHL : SaveI = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : SaveI = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = SaveI -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 ============================ VI = intVal 0 /\ [(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G = [(SaveI, intVal 0), (SaveI, intVal 0), (SaveE, V)]::G
< apply NEqHI to _. Subgoal 2.1.1.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : Hold = SaveI -> false L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI (intVal 0) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< L: case L1. Subgoal 2.1.1.1.2.1: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : Hold = SaveI -> false ============================ intVal 0 = intVal 0 /\ [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< search. Subgoal 2.1.1.1.2.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : Hold = SaveI -> false L1 : SaveI = SaveI -> false L2 : lookup [(SaveE, V)] SaveI (intVal 0) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< apply L1 to _. Subgoal 2.1.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI L1 : lookupScopes SaveI G (intVal 0) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< N: case L. Subgoal 2.1.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L1 : lookupScopes SaveI G (intVal 0) N : Hold = SaveI -> false N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< N: case N1. Subgoal 2.1.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : [] ++ [] = O1 L1 : lookupScopes SaveI G (intVal 0) N : Hold = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [(SaveE, V)] SaveI ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< apply N1 to _. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE1 O3 * EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 * EvC2 : O3 ++ O4 = O1 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvN: case EvC. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 * EvC2 : O3 ++ O4 = O1 EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal EE1 O3 * ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvN: case EvN. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 V1 EE2 O5 V2 O6 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 * EvC2 : O3 ++ O4 = O1 EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE2 O5 * EvN1 : evalExpr FE EE2 (num 0) V2 EE1 O6 * EvN2 : V1 = V2 -> false EvN3 : O5 ++ O6 = O3 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< case EvN1. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 V1 O5 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 * EvC2 : O3 ++ O4 = O1 EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE1 O5 * EvN2 : V1 = intVal 0 -> false EvN3 : O5 ++ [] = O3 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< case EvN. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) falseVal G1 O4 * EvC2 : O3 ++ O4 = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvL: case EvC1. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : O3 ++ O4 = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal G1 O4 * ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< EvL: case EvL (keep). Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : O3 ++ O4 = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal G1 O4 * EvL1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name L) (recVal Fields) G1 O4 * EvL2 : lookup Fields "null" trueVal ============================ VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< case EvL1. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : O3 ++ [] = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] * EvL2 : lookup Fields "null" trueVal H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< case IsG+. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : O3 ++ [] = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] * EvL2 : lookup Fields "null" trueVal H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) H3 : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] H4 : is_list (is_list (is_pair is_string is_value)) G ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< apply lookupScopes_is to _ LS. Subgoal 2.1.2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvC2 : O3 ++ [] = O1 EvN2 : V1 = intVal 0 -> false EvN3 : [] ++ [] = O3 H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1 EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] * EvL2 : lookup Fields "null" trueVal H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields) H3 : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] H4 : is_list (is_list (is_pair is_string is_value)) G H5 : is_value OldL H6 : is_string L ============================ VI = intVal 0 /\ [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
< apply evalExpr_unique to _ _ _ EvNL EvL. Subgoal 2: Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE G1 (null (name L)) falseVal G1 [] EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 * Eq : VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G ============================ exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
< case Eq. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 EvW : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) O1 * ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< clear EvW. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< EvA: case EvA. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 V1 EE1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (name SaveE) V1 EE1 O2 EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) EE1 G2 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< LL: case EvA. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< Eq: assert V1 = V. Subgoal 2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1 ============================ V1 = V
< LL: case LL. Subgoal 2.2.1: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE V1 ============================ V1 = V
< L: case LL. Subgoal 2.2.1.1: Variables: OldL SaveI SaveE Copy L V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : SaveE = SaveI -> false NEqHL : SaveE = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : SaveE = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = SaveE -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ V1 = V
< apply NEqHE to _. Subgoal 2.2.1.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = SaveE -> false L1 : lookup [(SaveI, intVal 0), (SaveE, V)] SaveE V1 ============================ V1 = V
< L: case L1. Subgoal 2.2.1.2.1: Variables: OldL Hold SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveE -> false NEqHL : Hold = L -> false NEqIE : SaveE = SaveE -> false NEqIL : SaveE = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveE = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] (intVal 0) FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) G2 L : Hold = SaveE -> false ============================ intVal 0 = V
< apply NEqIE to _. Subgoal 2.2.1.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = SaveE -> false L1 : SaveI = SaveE -> false L2 : lookup [(SaveE, V)] SaveE V1 ============================ V1 = V
< L: case L2. Subgoal 2.2.1.2.2.1: Variables: OldL Hold SaveI SaveE Copy L HoldL G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) G2 L : Hold = SaveE -> false L1 : SaveI = SaveE -> false ============================ V1 = V1
< search. Subgoal 2.2.1.2.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = SaveE -> false L1 : SaveI = SaveE -> false L2 : SaveE = SaveE -> false L3 : lookup [] SaveE V1 ============================ V1 = V
< case L3. Subgoal 2.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE LL1 : lookupScopes SaveE G V1 ============================ V1 = V
< N: case LL. Subgoal 2.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL1 : lookupScopes SaveE G V1 N : Hold = SaveE -> false N1 : no_lookup [(SaveI, intVal 0), (SaveE, V)] SaveE ============================ V1 = V
< N: case N1. Subgoal 2.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL1 : lookupScopes SaveE G V1 N : Hold = SaveE -> false N1 : SaveI = SaveE -> false N2 : no_lookup [(SaveE, V)] SaveE ============================ V1 = V
< N: case N2. Subgoal 2.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL1 : lookupScopes SaveE G V1 N : Hold = SaveE -> false N1 : SaveI = SaveE -> false N2 : SaveE = SaveE -> false N3 : no_lookup [] SaveE ============================ V1 = V
< apply N2 to _. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V1 FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1 Eq : V1 = V ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< case Eq. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< clear LL. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< Eq: assert OldL = recVal FieldVals. Subgoal 2.3: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ OldL = recVal FieldVals
< L: case EvA1. Subgoal 2.3.1: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L (recVal FieldVals) ============================ OldL = recVal FieldVals
< L: case L. Subgoal 2.3.1.1: Variables: OldL SaveI SaveE Copy L V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ OldL = recVal FieldVals
< apply NEqHL to _. Subgoal 2.3.1.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = L -> false L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal FieldVals) ============================ OldL = recVal FieldVals
< L: case L1. Subgoal 2.3.1.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = L -> false L1 : SaveI = L -> false L2 : lookup [(SaveE, V)] L (recVal FieldVals) ============================ OldL = recVal FieldVals
< L: case L2. Subgoal 2.3.1.2.1: Variables: OldL Hold SaveI Copy L HoldL G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) [] EvA2 : updateRecFields ["head"] (recVal FieldVals) FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) G2 L : Hold = L -> false L1 : SaveI = L -> false ============================ OldL = recVal FieldVals
< apply NEqEL to _. Subgoal 2.3.1.2.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : Hold = L -> false L1 : SaveI = L -> false L2 : SaveE = L -> false L3 : lookup [] L (recVal FieldVals) ============================ OldL = recVal FieldVals
< case L3. Subgoal 2.3.2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L L1 : lookupScopes L G (recVal FieldVals) ============================ OldL = recVal FieldVals
< apply lookupScopes_unique to LS L1. Subgoal 2.3.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L L1 : lookupScopes L G (recVal FieldVals) ============================ recVal FieldVals = recVal FieldVals
< search. Subgoal 2: Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G OldL EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Eq : OldL = recVal FieldVals ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
< case Eq. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< clear EvA1. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Is: case IsG+. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< apply lookupScopes_is to _ LS. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< apply lookupScopes_replaceScopes_exists to _ _ LS with V' = recVal NewVals. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< Eq: assert G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R. Subgoal 2.4: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R ============================ G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< RS: case EvA3. Subgoal 2.4.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS : mem (L, I) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain ============================ ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< M: case RS. Subgoal 2.4.1.1: Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes Hold G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name Hold)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string Hold H3 : replaceScopes Hold (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Hold LRemain ============================ ((Hold, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< apply NEqHL to _. Subgoal 2.4.1.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)] ============================ ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< M: case M. Subgoal 2.4.1.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes SaveI G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name SaveI)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string SaveI H3 : replaceScopes SaveI (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain ============================ ((SaveI, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< apply NEqIL to _. Subgoal 2.4.1.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [(SaveE, V)] ============================ ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< M: case M. Subgoal 2.4.1.2.2.1: Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes SaveE G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name SaveE)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string SaveE H3 : replaceScopes SaveE (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain ============================ ((SaveE, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< apply NEqEL to _. Subgoal 2.4.1.2.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain M : mem (L, I) [] ============================ ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< case M. Subgoal 2.4.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R New IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal NewVals) G New ============================ [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< apply replaceScopes_unique to RS1 _. Subgoal 2.4.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RS : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L RS1 : replaceScopes L (recVal NewVals) G R ============================ [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
< search. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2 Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R Eq : G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case Eq. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< assert replaceRecVal "head" V FieldVals NewVals. Subgoal 2.5: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R ============================ replaceRecVal "head" V FieldVals NewVals
< RRV: case EvA2. Subgoal 2.5.1: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RRV : replaceRecVal "head" V FieldVals NewVals ============================ replaceRecVal "head" V FieldVals NewVals
< search. Subgoal 2.5.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields Updated IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R RRV : lookup FieldVals "head" (recVal Fields) RRV1 : updateRecFields [] V Fields Updated RRV2 : replaceRecVal "head" (recVal Updated) FieldVals NewVals ============================ replaceRecVal "head" V FieldVals NewVals
< case RRV1. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< EvNL: case EvNL. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (name L) (recVal Fields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [] EvNL1 : lookup Fields "null" falseVal ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< EvNL: case EvNL. Subgoal 2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal EvNL : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< L: case EvNL. Subgoal 2.6: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< L: case L. Subgoal 2.6.1: Variables: SaveI SaveE Copy L V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : L = SaveI -> false NEqHL : L = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : L = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = L -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::G) ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< apply NEqHL to _. Subgoal 2.6.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< L: case L1. Subgoal 2.6.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false L2 : lookup [(SaveE, V)] L (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< L: case L2. Subgoal 2.6.2.1: Variables: Hold SaveI Copy L HoldL G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false NEqEL : L = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : L = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] (recVal Fields) FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" (recVal Fields) FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I (recVal Fields) NewL
< apply NEqEL to _. Subgoal 2.6.2.2: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : Hold = L -> false L1 : SaveI = L -> false L2 : SaveE = L -> false L3 : lookup [] L (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< case L3. Subgoal 2.7: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup Fields "null" falseVal L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L L1 : lookupScopes L G (recVal Fields) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< apply lookupScopes_unique to L1 LS. Subgoal 2.7: Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2, (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * -> evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 -> exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsCopy : is_string Copy LS : lookupScopes L G (recVal FieldVals) EvA2 : updateRecFields ["head"] V FieldVals NewVals EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G H1 : is_value (recVal FieldVals) H2 : is_string L H3 : replaceScopes L (recVal NewVals) G R H4 : replaceRecVal "head" V FieldVals NewVals EvNL1 : lookup FieldVals "null" falseVal L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L L1 : lookupScopes L G (recVal FieldVals) ============================ exists I NewL, intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward. Subgoal 1: Variables: Names FE EE V EE' O Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (nil Ty) V EE' O ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V EE'' O /\ scopes_same EE' EE''
< case Ev. Subgoal 1: Variables: Names FE EE' Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE' Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE' (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) (recVal [("null", trueVal)]) EE'' [] /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE. Subgoal 1: Variables: Names FE EE' Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE' Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' H1 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE' (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) (recVal [("null", trueVal)]) EE'' [] /\ scopes_same EE' EE''
< search. Subgoal 2: Variables: Names FE EE V EE' O E2 E1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) V EE' O ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O /\ scopes_same EE' EE'
< split. Subgoal 2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< unfold . Subgoal 2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalRecFields FE EE (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) [("null", falseVal), ("head", V1), ("tail", V2)] EE' O
< unfold . Subgoal 2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ exists EE1 O1 O2, evalExpr FE EE false falseVal EE1 O1 /\ (evalRecFields FE EE1 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O2 /\ O1 ++ O2 = O)
< exists EE, [], O. Subgoal 2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE false falseVal EE [] /\ (evalRecFields FE EE (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O /\ [] ++ O = O)
< split. Subgoal 2.1.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE false falseVal EE []
< search. Subgoal 2.1.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalRecFields FE EE (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O
< unfold . Subgoal 2.1.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ exists EE1 O1 O2, evalExpr FE EE E1 V1 EE1 O1 /\ (evalRecFields FE EE1 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O2 /\ O1 ++ O2 = O)
< exists EE3, O2, O3. Subgoal 2.1.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE E1 V1 EE3 O2 /\ (evalRecFields FE EE3 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O3 /\ O2 ++ O3 = O)
< split. Subgoal 2.1.2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE E1 V1 EE3 O2
< search. Subgoal 2.1.2.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalRecFields FE EE3 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O3
< unfold . Subgoal 2.1.2.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ exists EE1 O1 O2, evalExpr FE EE3 E2 V2 EE1 O1 /\ (evalRecFields FE EE1 nilRecFieldExprs [] EE' O2 /\ O1 ++ O2 = O3)
< exists EE', O3, []. Subgoal 2.1.2.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE3 E2 V2 EE' O3 /\ (evalRecFields FE EE' nilRecFieldExprs [] EE' [] /\ O3 ++ [] = O3)
< split. Subgoal 2.1.2.2.1: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalExpr FE EE3 E2 V2 EE' O3
< search. Subgoal 2.1.2.2.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ evalRecFields FE EE' nilRecFieldExprs [] EE' []
< search. Subgoal 2.1.2.2.3: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ O3 ++ [] = O3
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 2.1.2.2.3: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' IsO3 : is_list is_value O3 ============================ O3 ++ [] = O3
< apply is_list_values_append_nil to IsO3. Subgoal 2.1.2.2.3: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' IsO3 : is_list is_value O3 H5 : O3 ++ [] = O3 ============================ O3 ++ [] = O3
< search. Subgoal 2.1.2.3: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ O2 ++ O3 = O
< search. Subgoal 2.1.3: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ [] ++ O = O
< search. Subgoal 2.2: Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE3 E2 V2 EE' O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ scopes_same EE' EE'
< search. Subgoal 3: Variables: Names FE EE V EE' O E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 3: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 3: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 3: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 4: Variables: Names FE EE V EE' O E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 4: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 4: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 4: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 5: Variables: Names FE EE V EE' O E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 5: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 5: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 5: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 5: Variables: Names FE EE V EE' O E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsE : is_expr (index Lst Index) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index Lst Index) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index Lst Index) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< IsIdx+: apply evalExpr_isValue to _ _ _ Ev1. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsIdx+ : is_value (intVal Idx) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< case IsIdx+. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< rename N to LengthEE. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE. Subgoal 6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ newNameScopes [[]] LengthEE ([]::EE) EE
< unfold . Subgoal 6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ exists N SNames BNames, ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 6.1.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ length EE LengthEE
< search. Subgoal 6.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ drop 1 ([]::EE) EE
< search. Subgoal 6.1.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ take 1 ([]::EE) [[]]
< search. Subgoal 6.1.4: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ names [[]] []
< search. Subgoal 6.1.5: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ names EE Names
< search. Subgoal 6.1.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 6.1.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE M : mem X [] H5 : mem X Names ============================ false
< case M. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_L: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS_L. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS_L. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev Len. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_A' = []::EE3. Subgoal 6.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE ============================ EE_A' = []::EE3
< NNS': case NNS_L'. Subgoal 6.2.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' N SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N EE_A' EE3 NNS'2 : take N EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE3
< Take: case NNS'2. Subgoal 6.2.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N2 L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N ([]::L) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N Take1 : take N2 L [] ============================ []::L = []::EE3
< case Take1. Subgoal 6.2.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N ([]::L) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N ============================ []::L = []::EE3
< compute Take. Subgoal 6.2.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop 1 ([]::L) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L = []::EE3
< Drop: case NNS'1. Subgoal 6.2.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L N1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop1 : drop N1 L EE3 ============================ []::L = []::EE3
< Drop': case Drop1. Subgoal 6.2.1.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ []::EE3 = []::EE3
< search. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop' : 1 + N3 = N1 Drop'1 : drop N3 L1 EE3 ============================ []::(X::L1) = []::EE3
< G: apply drop_geq_0 to Drop'1. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop' : 1 + N3 = N1 Drop'1 : drop N3 L1 EE3 G : N3 >= 0 ============================ []::(X::L1) = []::EE3
< P: assert 1 + -1 = 0. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop' : 1 + N3 = N1 Drop'1 : drop N3 L1 EE3 G : N3 >= 0 P : 1 + -1 = 0 ============================ []::(X::L1) = []::EE3
< apply drop_is_integer to Drop'1. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop' : 1 + N3 = N1 Drop'1 : drop N3 L1 EE3 G : N3 >= 0 P : 1 + -1 = 0 H5 : is_integer N3 ============================ []::(X::L1) = []::EE3
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N1 = 1 Drop' : 1 + N3 = N1 Drop'1 : drop N3 L1 EE3 G : N3 >= 0 P : 1 + -1 = 0 H5 : is_integer N3 H6 : is_integer N1 ============================ []::(X::L1) = []::EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N3 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N3 = 0 Drop'1 : drop N3 L1 EE3 G : N3 >= 0 P : 1 + -1 = 0 H5 : is_integer N3 H6 : is_integer 0 ============================ []::(X::L1) = []::EE3
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE3 G : -1 >= 0 P : 1 + -1 = 0 H5 : is_integer -1 H6 : is_integer 0 ============================ []::(X::L1) = []::EE3
< L: case G. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE3 P : 1 + -1 = 0 H5 : is_integer -1 H6 : is_integer 0 L : 0 <= -1 ============================ []::(X::L1) = []::EE3
< case L. Subgoal 6.2.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2 LenEE3 : length (S::BR) LengthEE NNS' : newNameScopes [[]] LengthEE AR BR ============================ S::AR = []::(S::BR)
< LenBR: case LenEE3. Subgoal 6.2.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ S::AR = []::(S::BR)
< apply length_is to LenBR. Subgoal 6.2.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' ============================ S::AR = []::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 6.2.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' LEq : LengthEE <= N' ============================ S::AR = []::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 6.2.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ S::AR = []::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE Eq : EE_A' = []::EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_DL: assert evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< IsEE3: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr1. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr2. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NamesEE3: apply names_exists to IsEE3. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NNS_I: assert newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3. Subgoal 6.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
< unfold . Subgoal 6.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ exists N SNames BNames, ((((length EE3 LengthEE /\ drop N ([(SaveL, LV)]::EE3) EE3) /\ take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] SNames) /\ names EE3 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveL], N. Subgoal 6.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ ((((length EE3 LengthEE /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] [SaveL]) /\ names EE3 N) /\ (forall X, mem X [SaveL] -> mem X N -> false)
< split. Subgoal 6.3.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ length EE3 LengthEE
< search. Subgoal 6.3.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ drop 1 ([(SaveL, LV)]::EE3) EE3
< search. Subgoal 6.3.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
< search. Subgoal 6.3.4: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ names [[(SaveL, LV)]] [SaveL]
< search. Subgoal 6.3.5: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ names EE3 N
< search. Subgoal 6.3.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ============================ forall X, mem X [SaveL] -> mem X N -> false
< intros ML MN. Subgoal 6.3.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N ML : mem X [SaveL] MN : mem X N ============================ false
< ML: case ML. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N MN : mem SaveL N ============================ false
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N MN : mem SaveL N NS : names_same EE EE3 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N MN : mem SaveL N NS : names_same EE EE3 NS' : names_same EE3 EE ============================ false
< MNames: apply names_same_names to _ NamesEE3 Names MN. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N MN : mem SaveL N NS : names_same EE EE3 NS' : names_same EE3 EE MNames : mem SaveL Names ============================ false
< apply fresh_name_not_mem to Pr2 MNames. Subgoal 6.3.6.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N MN : mem X N ML : mem X [] ============================ false
< case ML. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_I: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS_I. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NNS_If: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_I Ev1 NNS_I. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< LenEE': apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_A'1 = [(SaveL, LV)]::EE'. Subgoal 6.4: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE ============================ EE_A'1 = [(SaveL, LV)]::EE'
< NNS': case NNS_If. Subgoal 6.4.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 N1 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N1 EE_A'1 EE' NNS'2 : take N1 EE_A'1 [[(SaveL, LV)]] NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A'1 = [(SaveL, LV)]::EE'
< Take: case NNS'2. Subgoal 6.4.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N N1 SNames BNames N2 L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N1 ([(SaveL, LV)]::L) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L [] ============================ [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
< case Take1. Subgoal 6.4.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N N1 SNames BNames L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N1 ([(SaveL, LV)]::L) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
< compute Take. Subgoal 6.4.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop 1 ([(SaveL, LV)]::L) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
< Drop: case NNS'1. Subgoal 6.4.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE' ============================ [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
< Drop': case Drop1. Subgoal 6.4.1.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ [(SaveL, LV)]::EE' = [(SaveL, LV)]::EE'
< search. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< G: apply drop_geq_0 to Drop'1. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< P: assert 1 + -1 = 0. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< apply drop_is_integer to Drop'1. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H8 : is_integer N4 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H8 : is_integer N4 H9 : is_integer N3 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N4 L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N4 = 0 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H8 : is_integer N4 H9 : is_integer 0 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' G : -1 >= 0 P : 1 + -1 = 0 H8 : is_integer -1 H9 : is_integer 0 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< L: case G. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L1 X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' P : 1 + -1 = 0 H8 : is_integer -1 H9 : is_integer 0 L : 0 <= -1 ============================ [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
< case L. Subgoal 6.4.2: Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3 LenEE' : length (S::BR) LengthEE NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR ============================ S::AR = [(SaveL, LV)]::(S::BR)
< LenBR: case LenEE'. Subgoal 6.4.2: Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ S::AR = [(SaveL, LV)]::(S::BR)
< apply length_is to LenBR. Subgoal 6.4.2: Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' ============================ S::AR = [(SaveL, LV)]::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 6.4.2: Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' LEq : LengthEE <= N' ============================ S::AR = [(SaveL, LV)]::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 6.4.2: Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ S::AR = [(SaveL, LV)]::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE Eq : EE_A'1 = [(SaveL, LV)]::EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_DI: assert evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< GEq: apply listIndex_geq_0 to _ Ev2. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 GEq : Idx >= 0 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< case GEq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_C: assert evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< EvIf: assert evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< NEq: assert SaveL = SaveI -> false. Subgoal 6.5: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] ============================ SaveL = SaveI -> false
< intros E. Subgoal 6.5: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] E : SaveL = SaveI ============================ false
< case E. Subgoal 6.5: Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 6.5: Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N S Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] AppI : "I" ++ S = SaveI ============================ false
< AppL: apply fresh_name_start to _ Pr2. Subgoal 6.5: Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N S S1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] AppI : "I" ++ S = SaveI AppL : "L" ++ S1 = SaveI ============================ false
< case AppI. Subgoal 6.5: Variables: Names FE EE V EE' O Index Lst LV EE3 O2 Idx O3 LengthEE N S S1 L3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy ("I"::L3) Lst) (seq (declare intTy ("I"::L3) Index) (seq (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1)))))))) (recFieldAccess (name ("I"::L3)) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names ("I"::L3) Pr2 : fresh_name "L" Names ("I"::L3) H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy ("I"::L3) Lst) ([("I"::L3, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string ("I"::L3) H7 : is_string ("I"::L3) NamesEE3 : names EE3 N NNS_I : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE3) EE3 Ev_I : evalExpr FE ([("I"::L3, LV)]::EE3) Index (intVal Idx) ([("I"::L3, LV)]::EE') O3 NNS_If : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([("I"::L3, LV)]::EE3) (declare intTy ("I"::L3) Index) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (greater (num 0) (name ("I"::L3))) falseVal ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] EvIf : evalStmt FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] AppL : "L" ++ S1 = "I"::L3 H9 : [] ++ S = L3 ============================ false
< case AppL. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< EvWhile: apply index_to_while to Ev2 NEq _ with Ctx = EE' FE = FE. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< Ev_W: apply drop_ext_size_evalStmt to EvWhile. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< assert SaveI = SaveL -> false. Subgoal 6.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ SaveI = SaveL -> false
< intros E. Subgoal 6.6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] E : SaveI = SaveL ============================ false
< case E. Subgoal 6.6: Variables: Names FE EE V EE' O SaveL Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveL Index) (seq (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveL Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveL Index) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveL)) falseVal ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveL -> false EvWhile : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ false
< backchain NEq. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< assert lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields). Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< assert evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 6: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O /\ scopes_same EE' EE'
< split. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< IsO: apply append_values_is to _ _ Ev3. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< apply is_list_values_append_nil to IsO3. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< unfold . Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ exists EE1 O1 Scope O2, evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE1 O1 /\ (evalExpr FE EE1 (recFieldAccess (name SaveL) "head") V (Scope::EE') O2 /\ O1 ++ O2 = O)
< exists [(SaveI, intVal 0), (SaveL, recVal Fields)]::EE', O, [(SaveI, intVal 0), (SaveL, recVal Fields)], []. Subgoal 6.7: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O /\ (evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] /\ O ++ [] = O)
< split. Subgoal 6.7.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O
< search. Subgoal 6.7.2: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
< search. Subgoal 6.7.3: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H12 : O3 ++ [] = O3 ============================ O ++ [] = O
< backchain is_list_values_append_nil. Subgoal 6.8: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ scopes_same EE' EE'
< apply evalStmt_isCtx to _ _ _ Ev_DL. Subgoal 6.8: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3) ============================ scopes_same EE' EE'
< apply evalStmt_isCtx to _ _ _ Ev_DI. Subgoal 6.8: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3) H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') ============================ scopes_same EE' EE'
< IsEE'+: apply evalStmt_isCtx to _ _ _ Ev_W. Subgoal 6.8.1: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3) H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') ============================ is_stmt (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))
< search 20. Subgoal 6.8: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3) H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') IsEE'+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') ============================ scopes_same EE' EE'
< case IsEE'+. Subgoal 6.8: Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index Ev : evalExpr FE EE Lst LV EE3 O2 Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3 Ev2 : listIndex LV Idx V Ev3 : O2 ++ O3 = O H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveL NamesEE3 : names EE3 N NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H8 : 0 <= Idx Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3) H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') H14 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveL, recVal Fields)] H15 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 7: Variables: Names FE EE V EE' O Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) V EE' O Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 7: Variables: Names FE EE V EE' O Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) V EE' O Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] N ([]::EE) EE. Subgoal 7.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ newNameScopes [[]] N ([]::EE) EE
< unfold . Subgoal 7.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 ([]::EE) EE) /\ take N1 ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 7.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ ((((length EE N /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 7.1.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ length EE N
< search. Subgoal 7.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ drop 1 ([]::EE) EE
< search. Subgoal 7.1.3: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ take 1 ([]::EE) [[]]
< search. Subgoal 7.1.4: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ names [[]] []
< search. Subgoal 7.1.5: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ names EE Names
< search. Subgoal 7.1.6: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 7.1.6: Variables: Names FE EE EE' O Len SaveL E1 V1 I N X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N M : mem X [] H2 : mem X Names ============================ false
< case M. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_L: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< NNS_L: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N EE_A' EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< LenEE': apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N EE_A' EE' LenEE' : length EE' N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_A' = []::EE'. Subgoal 7.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N EE_A' EE' LenEE' : length EE' N ============================ EE_A' = []::EE'
< NNS': case NNS_L. Subgoal 7.2.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' N1 SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O LenEE' : length EE' N NNS' : length EE' N NNS'1 : drop N1 EE_A' EE' NNS'2 : take N1 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE'
< Take: case NNS'2. Subgoal 7.2.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N N1 SNames BNames N2 L Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N NNS' : length EE' N NNS'1 : drop N1 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L [] ============================ []::L = []::EE'
< case Take1. Subgoal 7.2.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N N1 SNames BNames L Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N NNS' : length EE' N NNS'1 : drop N1 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ []::L = []::EE'
< compute Take. Subgoal 7.2.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N NNS' : length EE' N NNS'1 : drop 1 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L = []::EE'
< Drop: case NNS'1. Subgoal 7.2.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE' ============================ []::L = []::EE'
< Drop': case Drop1. Subgoal 7.2.1.1: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ []::EE' = []::EE'
< search. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' ============================ []::(X::L1) = []::EE'
< G: apply drop_geq_0 to Drop'1. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 ============================ []::(X::L1) = []::EE'
< P: assert 1 + -1 = 0. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 ============================ []::(X::L1) = []::EE'
< apply drop_is_integer to Drop'1. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H2 : is_integer N4 ============================ []::(X::L1) = []::EE'
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H2 : is_integer N4 H3 : is_integer N3 ============================ []::(X::L1) = []::EE'
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N4 L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N4 = 0 Drop'1 : drop N4 L1 EE' G : N4 >= 0 P : 1 + -1 = 0 H2 : is_integer N4 H3 : is_integer 0 ============================ []::(X::L1) = []::EE'
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' G : -1 >= 0 P : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 ============================ []::(X::L1) = []::EE'
< L: case G. Subgoal 7.2.1.2: Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L1 X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N NNS' : length EE' N NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' P : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 L : 0 <= -1 ============================ []::(X::L1) = []::EE'
< case L. Subgoal 7.2.2: Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O LenEE' : length (S::BR) N NNS' : newNameScopes [[]] N AR BR ============================ S::AR = []::(S::BR)
< LenBR: case LenEE'. Subgoal 7.2.2: Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ S::AR = []::(S::BR)
< apply length_is to LenBR. Subgoal 7.2.2: Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' ============================ S::AR = []::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 7.2.2: Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' LEq : N <= N' ============================ S::AR = []::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 7.2.2: Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' LEq : N <= N' L : N' < N ============================ S::AR = []::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N EE_A' EE' LenEE' : length EE' N Eq : EE_A' = []::EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_DL: assert evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_DLen: assert evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< apply listLength_is to _ Ev1. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< NEq: assert SaveL = Len -> false. Subgoal 7.3: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I ============================ SaveL = Len -> false
< intros E. Subgoal 7.3: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I E : SaveL = Len ============================ false
< case E. Subgoal 7.3: Variables: Names FE EE EE' O Len E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names Len Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I ============================ false
< AppLen: apply fresh_name_start to _ Pr2. Subgoal 7.3: Variables: Names FE EE EE' O Len E1 V1 I N S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names Len Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = Len ============================ false
< FrL: case Pr1. Subgoal 7.3.1: Variables: Names FE EE EE' O E1 V1 I N S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names "L" H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy "L" E1) ([("L", V1)]::EE') O Ev_DLen : evalStmt FE ([("L", V1)]::EE') (declare intTy "L" (num 0)) ([("L", intVal 0), ("L", V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = "L" FrL : not_mem "L" Names ============================ false
< App: case AppLen. Subgoal 7.3.1: Variables: Names FE EE EE' O E1 V1 I N S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names "L" H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy "L" E1) ([("L", V1)]::EE') O Ev_DLen : evalStmt FE ([("L", V1)]::EE') (declare intTy "L" (num 0)) ([("L", intVal 0), ("L", V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I FrL : not_mem "L" Names App : "en" ++ S = [] ============================ false
< case App. Subgoal 7.3.2: Variables: Names FE EE EE' O Len E1 V1 I N S NewBase Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL1 : "L" ++ "_" = NewBase FrL2 : fresh_name NewBase Names Len ============================ false
< AppL: case FrL1. Subgoal 7.3.2: Variables: Names FE EE EE' O Len E1 V1 I N S L3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name ("L"::L3) Names Len AppL : [] ++ "_" = L3 ============================ false
< case AppL. Subgoal 7.3.2: Variables: Names FE EE EE' O Len E1 V1 I N S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name "L_" Names Len ============================ false
< AppL: apply fresh_name_start to _ FrL2. Subgoal 7.3.2: Variables: Names FE EE EE' O Len E1 V1 I N S S1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name "L_" Names Len AppL : "L_" ++ S1 = Len ============================ false
< AppL: case AppL. Subgoal 7.3.2: Variables: Names FE EE EE' O E1 V1 I N S S1 L1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::L1) E1) (seq (declare intTy ("L"::L1) (num 0)) (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))))) (name ("L"::L1)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names ("L"::L1) H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::L1) E1) ([("L"::L1, V1)]::EE') O Ev_DLen : evalStmt FE ([("L"::L1, V1)]::EE') (declare intTy ("L"::L1) (num 0)) ([("L"::L1, intVal 0), ("L"::L1, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = "L"::L1 FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::L1) AppL : "_" ++ S1 = L1 ============================ false
< case AppL. Subgoal 7.3.2: Variables: Names FE EE EE' O E1 V1 I N S S1 L4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names ("L"::("_"::L4)) H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::("_"::L4)) E1) ([("L"::("_"::L4), V1)]::EE') O Ev_DLen : evalStmt FE ([("L"::("_"::L4), V1)]::EE') (declare intTy ("L"::("_"::L4)) (num 0)) ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I AppLen : "Len" ++ S = "L"::("_"::L4) FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::("_"::L4)) H4 : [] ++ S1 = L4 ============================ false
< AppLen: case AppLen. Subgoal 7.3.2: Variables: Names FE EE EE' O E1 V1 I N S S1 L4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr2 : fresh_name "Len" Names ("L"::("_"::L4)) H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::("_"::L4)) E1) ([("L"::("_"::L4), V1)]::EE') O Ev_DLen : evalStmt FE ([("L"::("_"::L4), V1)]::EE') (declare intTy ("L"::("_"::L4)) (num 0)) ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::("_"::L4)) H4 : [] ++ S1 = L4 AppLen : "en" ++ S = "_"::L4 ============================ false
< case AppLen. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< P: assert 0 + I = I. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< P': apply plus_integer_comm to _ _ P. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_W_ES: apply length_to_while to Ev1 NEq P' _ _ with FE = FE Ctx = EE'. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_W: apply drop_ext_size_evalStmt to Ev_W_ES. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< LS: assert lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I). Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< Ev_N: assert evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 7: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O /\ scopes_same EE' EE'
< split. Subgoal 7.4: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
< apply is_list_values_append_nil to IsO. Subgoal 7.4: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H4 : O ++ [] = O ============================ evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
< search. Subgoal 7.5: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 7.5: Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Ev1 : listLength V1 I LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N ([]::EE') EE' LenEE' : length EE' N Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] IsO : is_list is_value O H2 : is_value V1 H3 : is_integer I NEq : SaveL = Len -> false P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H4 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward. Subgoal 1: Variables: Names FE EE V EE' O Ctx Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (nil Ty) [] Ev : evalExpr FE EE (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V EE' O ============================ exists EE'', evalExpr FE EE (nil Ty) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx Ty VF Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (nil Ty) [] Ev : evalRecFields FE EE (consRecFieldExprs "null" true nilRecFieldExprs) VF EE' O ============================ exists EE'', evalExpr FE EE (nil Ty) (recVal VF) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx Ty EE3 O2 O3 VRest V1 Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (nil Ty) [] Ev : evalExpr FE EE true V1 EE3 O2 Ev1 : evalRecFields FE EE3 nilRecFieldExprs VRest EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (nil Ty) (recVal (("null", V1)::VRest)) EE'' O /\ scopes_same EE' EE''
< case Ev. Subgoal 1: Variables: Names FE EE' O Ctx Ty EE3 O3 VRest Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE3 Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (nil Ty) [] Ev1 : evalRecFields FE EE3 nilRecFieldExprs VRest EE' O3 Ev2 : [] ++ O3 = O ============================ exists EE'', evalExpr FE EE3 (nil Ty) (recVal (("null", trueVal)::VRest)) EE'' O /\ scopes_same EE' EE''
< case Ev1. Subgoal 1: Variables: Names FE EE' O Ctx Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE' Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (nil Ty) [] Ev2 : [] ++ [] = O ============================ exists EE'', evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' O /\ scopes_same EE' EE''
< case Ev2. Subgoal 1: Variables: Names FE EE' Ctx Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE' Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (nil Ty) [] ============================ exists EE'', evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' [] /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE. Subgoal 1: Variables: Names FE EE' Ctx Ty Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) Names : names EE' Names IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE' Ctx EN : exprNames Ctx (nil Ty) [] H1 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' [] /\ scopes_same EE' EE''
< search. Subgoal 2: Variables: Names FE EE V EE' O Ctx E2 E1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V EE' O ============================ exists EE'', evalExpr FE EE (cons E1 E2) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx E2 E1 VF Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalRecFields FE EE (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) VF EE' O ============================ exists EE'', evalExpr FE EE (cons E1 E2) (recVal VF) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx E2 E1 EE3 O2 O3 VRest V1 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalExpr FE EE false V1 EE3 O2 Ev1 : evalRecFields FE EE3 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) VRest EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (cons E1 E2) (recVal (("null", V1)::VRest)) EE'' O /\ scopes_same EE' EE''
< case Ev. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 O3 VRest Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev1 : evalRecFields FE EE3 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) VRest EE' O3 Ev2 : [] ++ O3 = O ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::VRest)) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 VRest1 V2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev2 : [] ++ O3 = O Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev1 : evalRecFields FE EE1 (consRecFieldExprs "tail" E2 nilRecFieldExprs) VRest1 EE' O4 Ev3 : O1 ++ O4 = O3 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::(("head", V2)::VRest1))) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 V2 EE2 O5 O6 VRest2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev2 : [] ++ O3 = O Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O3 Ev1 : evalExpr FE EE1 E2 V3 EE2 O5 Ev4 : evalRecFields FE EE2 nilRecFieldExprs VRest2 EE' O6 Ev5 : O5 ++ O6 = O4 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::(("head", V2)::(("tail", V3)::VRest2)))) EE'' O /\ scopes_same EE' EE''
< case Ev4. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 V2 O5 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev2 : [] ++ O3 = O Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O3 Ev1 : evalExpr FE EE1 E2 V3 EE' O5 Ev5 : O5 ++ [] = O4 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< case Ev2. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 O5 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O5 Ev5 : O5 ++ [] = O4 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev5. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx EN : exprNames Ctx (cons E1 E2) [] Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< EN: case EN. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 N1 N2 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 N1 EN1 : exprNames Ctx E2 N2 EN2 : N1 ++ N2 = [] ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< case EN2. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 2: Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Names : names EE3 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE3 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE3 Ctx Ev : evalExpr FE EE3 E1 V2 EE1 O1 Ev3 : O1 ++ O4 = O Ev1 : evalExpr FE EE1 E2 V3 EE' O4 Ev5 : O4 ++ [] = O4 H1 : is_expr E1 H2 : is_expr E2 EN : exprNames Ctx E1 [] EN1 : exprNames Ctx E2 [] H3 : is_list (is_list (is_pair is_string is_value)) EE1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H4 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\ scopes_same EE' EE''
< search. Subgoal 3: Variables: Names FE EE V EE' O Ctx E1 Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) [] Ev : evalExpr FE EE (recFieldAccess E1 "null") V EE' O ============================ exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 3: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V ============================ exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 3: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 3: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (null E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "null" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 4: Variables: Names FE EE V EE' O Ctx E1 Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) [] Ev : evalExpr FE EE (recFieldAccess E1 "head") V EE' O ============================ exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 4: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V ============================ exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 4: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 4: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (head E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "head" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 5: Variables: Names FE EE V EE' O Ctx E1 Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) [] Ev : evalExpr FE EE (recFieldAccess E1 "tail") V EE' O ============================ exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 5: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V ============================ exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 5: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 5: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 5: Variables: Names FE EE V EE' O Ctx E1 Fields Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (tail E1) [] Ev : evalExpr FE EE E1 (recVal Fields) EE' O Ev1 : lookup Fields "tail" V H1 : is_expr E1 IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H2 : scopes_same EE' EE' ============================ exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
< search. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsE : is_expr (index Lst Index) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (index Lst Index) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (index Lst Index) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< EN: case EN. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst N1 N2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst N1 EN1 : exprNames Ctx Index N2 EN2 : N1 ++ N2 = [] ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case EN2. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE3 O2 Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 EE1 O1 O4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalStmt FE ([]::EE) (declare intTy SaveL Lst) EE1 O1 Ev3 : evalStmt FE EE1 (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) EE3 O4 Ev4 : O1 ++ O4 = O2 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev3. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 EE1 O1 O4 EE2 O5 O6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalStmt FE ([]::EE) (declare intTy SaveL Lst) EE1 O1 Ev4 : O1 ++ O4 = O2 Ev3 : evalStmt FE EE1 (declare intTy SaveI Index) EE2 O5 Ev5 : evalStmt FE EE2 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6 Ev6 : O5 ++ O6 = O4 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 EE2 O5 O6 EE5 Scope1 V1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev4 : O1 ++ O4 = O2 Ev3 : evalStmt FE (((SaveL, V1)::Scope1)::EE5) (declare intTy SaveI Index) EE2 O5 Ev5 : evalStmt FE EE2 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev3. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev4 : O1 ++ O4 = O2 Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ O3 = O Ev4 : O1 ++ O4 = O2 Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev1 : evalExpr FE EE3 (name SaveL) (recVal Fields) (Scope::EE') O3 Ev7 : lookup Fields "head" V ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) (Scope::EE') O6 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev5. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE N ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< rename N to LengthEE. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE. Subgoal 6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ newNameScopes [[]] LengthEE ([]::EE) EE
< unfold . Subgoal 6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ exists N SNames BNames, ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 6.1.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ length EE LengthEE
< search. Subgoal 6.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ drop 1 ([]::EE) EE
< search. Subgoal 6.1.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ take 1 ([]::EE) [[]]
< search. Subgoal 6.1.4: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ names [[]] []
< search. Subgoal 6.1.5: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ names EE Names
< search. Subgoal 6.1.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 6.1.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE M : mem X [] H3 : mem X Names ============================ false
< case M. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev_L: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN Ev NNS_L. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev_L NNS_L. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< IsLenEE: apply length_is to Len. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' IsLenEE : is_integer LengthEE ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< P: apply plus_integer_total to _ IsLenEE with N1 = 1. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< LenEE+: assert length ([]::EE) N3. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_B' = EE5 /\ Scope1 = []. Subgoal 6.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 ============================ EE_B' = EE5 /\ Scope1 = []
< NNS': case NNS_L'. Subgoal 6.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'1 : drop N (Scope1::EE5) EE_B' NNS'2 : take N (Scope1::EE5) [[]] NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_B' = EE5 /\ Scope1 = []
< Take: case NNS'2. Subgoal 6.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames N4 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'1 : drop N ([]::EE5) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N4 = N Take1 : take N4 EE5 [] ============================ EE_B' = EE5 /\ [] = []
< case Take1. Subgoal 6.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'1 : drop N ([]::EE5) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N ============================ EE_B' = EE5 /\ [] = []
< compute Take. Subgoal 6.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'1 : drop 1 ([]::EE5) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ EE_B' = EE5 /\ [] = []
< Drop: case NNS'1. Subgoal 6.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop1 : drop N5 EE5 EE_B' ============================ EE_B' = EE5 /\ [] = []
< Drop': case Drop1. Subgoal 6.2.1.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE_B') O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE_B') Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ EE_B' = EE_B' /\ [] = []
< search. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop' : 1 + N6 = N5 Drop'1 : drop N6 L EE_B' ============================ EE_B' = X::L /\ [] = []
< G: apply drop_geq_0 to Drop'1. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop' : 1 + N6 = N5 Drop'1 : drop N6 L EE_B' G : N6 >= 0 ============================ EE_B' = X::L /\ [] = []
< P': assert 1 + -1 = 0. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop' : 1 + N6 = N5 Drop'1 : drop N6 L EE_B' G : N6 >= 0 P' : 1 + -1 = 0 ============================ EE_B' = X::L /\ [] = []
< apply drop_is_integer to Drop'1. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop' : 1 + N6 = N5 Drop'1 : drop N6 L EE_B' G : N6 >= 0 P' : 1 + -1 = 0 H3 : is_integer N6 ============================ EE_B' = X::L /\ [] = []
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop' : 1 + N6 = N5 Drop'1 : drop N6 L EE_B' G : N6 >= 0 P' : 1 + -1 = 0 H3 : is_integer N6 H4 : is_integer N5 ============================ EE_B' = X::L /\ [] = []
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N6 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N6 = 0 Drop'1 : drop N6 L EE_B' G : N6 >= 0 P' : 1 + -1 = 0 H3 : is_integer N6 H4 : is_integer 0 ============================ EE_B' = X::L /\ [] = []
< apply plus_integer_unique_addend to _ _ _ Drop' P'. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B' G : -1 >= 0 P' : 1 + -1 = 0 H3 : is_integer -1 H4 : is_integer 0 ============================ EE_B' = X::L /\ [] = []
< L: case G. Subgoal 6.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : length EE_B' LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B' P' : 1 + -1 = 0 H3 : is_integer -1 H4 : is_integer 0 L : 0 <= -1 ============================ EE_B' = X::L /\ [] = []
< case L. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR ============================ Scope1::BR = EE5 /\ Scope1 = []
< LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev_L Len. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR LenBR+ : length (Scope1::BR) LengthEE ============================ Scope1::BR = EE5 /\ Scope1 = []
< LenBR: case LenBR+. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ Scope1::BR = EE5 /\ Scope1 = []
< apply length_is to LenBR. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H3 : is_integer N' ============================ Scope1::BR = EE5 /\ Scope1 = []
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H3 : is_integer N' LEq : LengthEE <= N' ============================ Scope1::BR = EE5 /\ Scope1 = []
< L: apply lt_plus_one to LenBR1 _. Subgoal 6.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 NNS' : newNameScopes [[]] LengthEE EE5 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H3 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ Scope1::BR = EE5 /\ Scope1 = []
< apply less_lesseq_flip_false to L LEq. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1 Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE_B' O1 NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B' IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 Eq : EE_B' = EE5 /\ Scope1 = [] ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< LenEE5: apply evalExpr_keep_scopes to _ _ _ Ev_L Len. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< IsEE5: apply evalExpr_isCtx to _ _ _ Ev_L. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NamesEE5: apply names_exists to IsEE5. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NNS_I: assert newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5. Subgoal 6.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
< unfold . Subgoal 6.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ exists N SNames BNames, ((((length EE5 LengthEE /\ drop N ([(SaveL, V1)]::EE5) EE5) /\ take N ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]) /\ names [[(SaveL, V1)]] SNames) /\ names EE5 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveL], N. Subgoal 6.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ ((((length EE5 LengthEE /\ drop 1 ([(SaveL, V1)]::EE5) EE5) /\ take 1 ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]) /\ names [[(SaveL, V1)]] [SaveL]) /\ names EE5 N) /\ (forall X, mem X [SaveL] -> mem X N -> false)
< split. Subgoal 6.3.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ length EE5 LengthEE
< search. Subgoal 6.3.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ drop 1 ([(SaveL, V1)]::EE5) EE5
< search. Subgoal 6.3.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ take 1 ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]
< search. Subgoal 6.3.4: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ names [[(SaveL, V1)]] [SaveL]
< search. Subgoal 6.3.5: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ names EE5 N
< search. Subgoal 6.3.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ============================ forall X, mem X [SaveL] -> mem X N -> false
< intros ML MN. Subgoal 6.3.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N ML : mem X [SaveL] MN : mem X N ============================ false
< ML: case ML. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N MN : mem SaveL N ============================ false
< NS: apply evalExpr_names_same to _ _ _ Ev_L. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N MN : mem SaveL N NS : names_same EE EE5 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N MN : mem SaveL N NS : names_same EE EE5 NS' : names_same EE5 EE ============================ false
< MNames: apply names_same_names to _ NamesEE5 Names MN. Subgoal 6.3.6.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N MN : mem SaveL N NS : names_same EE EE5 NS' : names_same EE5 EE MNames : mem SaveL Names ============================ false
< apply fresh_name_not_mem to Pr2 MNames. Subgoal 6.3.6.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N MN : mem X N ML : mem X [] ============================ false
< case ML. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_ctx_names to _ _ _ _ _ EN Ev_L. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr1. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr2. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Ev_I: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN1 Ev3 NNS_I. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NNS_I': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 Ev_I _. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6. Subgoal 6.4: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1 ============================ Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6
< NNS': case NNS_I'. Subgoal 6.4.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'1 : drop N4 (Scope2::EE6) EE_B'1 NNS'2 : take N4 (Scope2::EE6) [[(SaveL, V1)]] NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6
< Take: case NNS'2. Subgoal 6.4.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames N5 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'1 : drop N4 ([(SaveL, V1)]::EE6) EE_B'1 NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N5 = N4 Take1 : take N5 EE6 [] ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
< case Take1. Subgoal 6.4.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'1 : drop N4 ([(SaveL, V1)]::EE6) EE_B'1 NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N4 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
< compute Take. Subgoal 6.4.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'1 : drop 1 ([(SaveL, V1)]::EE6) EE_B'1 NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
< Drop: case NNS'1. Subgoal 6.4.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 EE6 EE_B'1 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
< Drop': case Drop1. Subgoal 6.4.1.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE_B'1) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE_B'1) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE_B'1
< search. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L EE_B'1 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< G: apply drop_geq_0 to Drop'1. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L EE_B'1 G : N7 >= 0 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< P': assert 1 + -1 = 0. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L EE_B'1 G : N7 >= 0 P' : 1 + -1 = 0 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< apply drop_is_integer to Drop'1. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L EE_B'1 G : N7 >= 0 P' : 1 + -1 = 0 H7 : is_integer N7 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L EE_B'1 G : N7 >= 0 P' : 1 + -1 = 0 H7 : is_integer N7 H8 : is_integer N6 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N7 L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N7 = 0 Drop'1 : drop N7 L EE_B'1 G : N7 >= 0 P' : 1 + -1 = 0 H7 : is_integer N7 H8 : is_integer 0 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< apply plus_integer_unique_addend to _ _ _ Drop' P'. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B'1 G : -1 >= 0 P' : 1 + -1 = 0 H7 : is_integer -1 H8 : is_integer 0 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< L: case G. Subgoal 6.4.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames L X Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS' : length EE_B'1 LengthEE NNS'3 : names [[(SaveL, V1)]] SNames NNS'4 : names EE_B'1 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B'1 P' : 1 + -1 = 0 H7 : is_integer -1 H8 : is_integer 0 L : 0 <= -1 ============================ [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
< case L. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev_I LenEE5. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR LenBR+ : length (Scope2::BR) LengthEE ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< LenBR: case LenBR+. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< apply length_is to LenBR. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H7 : is_integer N' ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H7 : is_integer N' LEq : LengthEE <= N' ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< L: apply lt_plus_one to LenBR1 _. Subgoal 6.4.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N' Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5 NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H7 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
< apply less_lesseq_flip_false to L LEq. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1 Eq : Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< Eq: assert exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []. Subgoal 6.5: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< EvIf: case Ev5. Subgoal 6.5.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9 EvIf1 : evalStmt FE ([]::EE7) (printVal (errorExpr (stringLit "Die") intTy)) (Scope3::EE4) O10 EvIf2 : O9 ++ O10 = O7 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< EvP: case EvIf1. Subgoal 6.5.1.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 I O11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9 EvIf2 : O9 ++ O10 = O7 EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) (intVal I) (Scope3::EE4) O11 EvP1 : O11 ++ [intVal I] = O10 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvP. Subgoal 6.5.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 O11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9 EvIf2 : O9 ++ O10 = O7 EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) trueVal (Scope3::EE4) O11 EvP1 : O11 ++ [trueVal] = O10 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvP. Subgoal 6.5.1.3: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 O11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9 EvIf2 : O9 ++ O10 = O7 EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) falseVal (Scope3::EE4) O11 EvP1 : O11 ++ [falseVal] = O10 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvP. Subgoal 6.5.1.4: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 S O11 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9 EvIf2 : O9 ++ O10 = O7 EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) (stringVal S) (Scope3::EE4) O11 EvP1 : O11 ++ [stringVal S] = O10 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvP. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) falseVal EE7 O9 EvIf1 : evalStmt FE ([]::EE7) noop (Scope3::EE4) O10 EvIf2 : O9 ++ O10 = O7 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvIf1. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) falseVal EE4 O9 EvIf2 : O9 ++ [] = O7 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< EvG: case EvIf. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I1 EE8 O11 I2 O12 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf2 : O9 ++ [] = O7 EvG : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (num 0) (intVal I1) EE8 O11 EvG1 : evalExpr FE EE8 (name SaveI) (intVal I2) EE4 O12 EvG2 : I1 <= I2 EvG3 : O11 ++ O12 = O9 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvG. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I2 O12 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf2 : O9 ++ [] = O7 EvG1 : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (name SaveI) (intVal I2) EE4 O12 EvG2 : 0 <= I2 EvG3 : [] ++ O12 = O9 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvG3. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf2 : O9 ++ [] = O7 EvG1 : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (name SaveI) (intVal I2) EE4 O9 EvG2 : 0 <= I2 ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< LS: case EvG1. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O7 O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvIf2 : [] ++ [] = O7 EvG2 : 0 <= I2 LS : lookupScopes SaveI ([(SaveI, V2), (SaveL, V1)]::EE6) (intVal I2) ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = []
< case EvIf2. Subgoal 6.5.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 LS : lookupScopes SaveI ([(SaveI, V2), (SaveL, V1)]::EE6) (intVal I2) ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ [] = []
< LS: case LS. Subgoal 6.5.2.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 LS : lookup [(SaveI, V2), (SaveL, V1)] SaveI (intVal I2) ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ [] = []
< L: case LS. Subgoal 6.5.2.1.1: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal I2) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, intVal I2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal I2) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 ============================ exists IV, ((intVal I2 = intVal IV /\ IV >= 0) /\ [(SaveI, intVal I2), (SaveL, V1)]::EE6 = [(SaveI, intVal I2), (SaveL, V1)]::EE6) /\ [] = []
< search. Subgoal 6.5.2.1.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 L : SaveI = SaveI -> false L1 : lookup [(SaveL, V1)] SaveI (intVal I2) ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ [] = []
< apply L to _. Subgoal 6.5.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 LS : no_lookup [(SaveI, V2), (SaveL, V1)] SaveI LS1 : lookupScopes SaveI EE6 (intVal I2) ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ [] = []
< NL: case LS. Subgoal 6.5.2.2: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 EvG2 : 0 <= I2 LS1 : lookupScopes SaveI EE6 (intVal I2) NL : SaveI = SaveI -> false NL1 : no_lookup [(SaveL, V1)] SaveI ============================ exists IV, ((V2 = intVal IV /\ IV >= 0) /\ [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ [] = []
< apply NL to _. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7 Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : O7 ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index V2 EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 Eq : exists IV, ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\ O7 = [] ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< NEq: assert SaveL = SaveI -> false. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 ============================ SaveL = SaveI -> false
< intros E. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 E : SaveL = SaveI ============================ false
< case E. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveI H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6 H7 : IV >= 0 ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveI H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6 H7 : IV >= 0 AppI : "I" ++ S = SaveI ============================ false
< AppL: apply fresh_name_start to _ Pr2. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S S1 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveI H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveI H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6 H7 : IV >= 0 AppI : "I" ++ S = SaveI AppL : "L" ++ S1 = SaveI ============================ false
< case AppI. Subgoal 6.6: Variables: Names FE EE V EE' O Ctx Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S S1 L3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy ("I"::L3) Lst) (seq (declare intTy ("I"::L3) Index) (seq (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1)))))))) (recFieldAccess (name ("I"::L3)) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names ("I"::L3) Pr2 : fresh_name "L" Names ("I"::L3) H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([("I"::L3, V1)]::EE5) Index (intVal IV) ([("I"::L3, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes ("I"::L3) (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) [] Ev8 : evalStmt FE ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[("I"::L3, V1)]] LengthEE ([("I"::L3, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string ("I"::L3) H5 : is_string ("I"::L3) H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[("I"::L3, V1)]] LengthEE ([("I"::L3, V1)]::EE6) EE6 H7 : IV >= 0 AppL : "L" ++ S1 = "I"::L3 H8 : [] ++ S = L3 ============================ false
< case AppL. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8 Ev9 : [] ++ O8 = O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case Ev9. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< IsI: apply evalExpr_isValue to _ _ _ Ev_I. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false IsI : is_value (intVal IV) ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< case IsI. Subgoal 6: Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ O6 = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6 Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
< apply while_to_index to Ev8 Ev1 Ev7 _ _ NEq. Subgoal 6: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O2 O1 O4 O5 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O2 ++ [] = O Ev4 : O1 ++ O4 = O2 Ev6 : O5 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
< apply append_nil_right to Ev2. Subgoal 6: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 O5 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O5 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
< apply append_nil_right to Ev6. Subgoal 6: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O4 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
< exists EE6. Subgoal 6: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O4 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ evalExpr FE EE (index Lst Index) V EE6 O /\ scopes_same EE6 EE6
< split. Subgoal 6.7: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O4 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ evalExpr FE EE (index Lst Index) V EE6 O
< search. Subgoal 6.8: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O4 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V ============================ scopes_same EE6 EE6
< apply evalExpr_isCtx to _ _ _ Ev_I. Subgoal 6.8: Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3 Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "I" Names SaveI Pr2 : fresh_name "L" Names SaveL H1 : is_expr Lst H2 : is_expr Index EN : exprNames Ctx Lst [] EN1 : exprNames Ctx Index [] Ev2 : O ++ [] = O Ev4 : O1 ++ O4 = O Ev6 : O4 ++ [] = O4 Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1 Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4 Ev7 : lookup Fields "head" V Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields) Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) [] Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) [] Len : length EE LengthEE NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_L : evalExpr FE EE Lst V1 EE5 O1 NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5 IsLenEE : is_integer LengthEE P : 1 + LengthEE = N3 LenEE+ : length ([]::EE) N3 LenEE5 : length EE5 LengthEE IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5 NamesEE5 : names EE5 N NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5 H3 : ctx_names EE5 Ctx H4 : is_string SaveI H5 : is_string SaveL H6 : is_value V1 Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4 NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6 H7 : IV >= 0 NEq : SaveL = SaveI -> false H8 : is_integer IV H9 : listIndex V1 IV V H10 : is_list (is_list (is_pair is_string is_value)) EE6 ============================ scopes_same EE6 EE6
< backchain scopes_same_reflexive. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (exactEval:list:length E1) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< case IsE. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (exactEval:list:length E1) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< EN: case EN. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 EE3 O2 Scope O3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) EE3 O2 Ev1 : evalExpr FE EE3 (name Len) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 O2 Scope Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O2 Ev2 : O2 ++ [] = O Ev1 : lookupScopes Len (Scope::EE') V ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev2. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O Ev2 : O ++ [] = O Ev1 : lookupScopes Len (Scope::EE') V ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< clear Ev2. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O Ev1 : lookupScopes Len (Scope::EE') V ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope EE1 O1 O4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev : evalStmt FE ([]::EE) (declare intTy SaveL E1) EE1 O1 Ev2 : evalStmt FE EE1 (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) (Scope::EE') O4 Ev3 : O1 ++ O4 = O ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev2 : evalStmt FE (((SaveL, V1)::Scope1)::EE4) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) (Scope::EE') O4 Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev2. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1 EE2 O5 O6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1 Ev2 : evalStmt FE (((SaveL, V1)::Scope1)::EE4) (declare intTy Len (num 0)) EE2 O5 Ev4 : evalStmt FE EE2 (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6 Ev5 : O5 ++ O6 = O4 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev2. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1 O5 O6 EE6 Scope2 V2 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1 Ev4 : evalStmt FE (((Len, V2)::Scope2)::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6 Ev5 : O5 ++ O6 = O4 Ev2 : evalExpr FE (((SaveL, V1)::Scope1)::EE4) (num 0) V2 (Scope2::EE6) O5 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< case Ev2. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 O6 EE6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6 Ev5 : [] ++ O6 = O4 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< case Ev5. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] N ([]::EE) EE. Subgoal 7.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ newNameScopes [[]] N ([]::EE) EE
< unfold . Subgoal 7.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 ([]::EE) EE) /\ take N1 ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 7.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ ((((length EE N /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 7.1.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ length EE N
< search. Subgoal 7.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ drop 1 ([]::EE) EE
< search. Subgoal 7.1.3: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ take 1 ([]::EE) [[]]
< search. Subgoal 7.1.4: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ names [[]] []
< search. Subgoal 7.1.5: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ names EE Names
< search. Subgoal 7.1.6: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 7.1.6: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N M : mem X [] H2 : mem X Names ============================ false
< case M. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Ev_E1: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN Ev NNS. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev_E1 NNS. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B' ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< LenEE_B': apply evalExpr_keep_scopes to _ _ _ Ev_E1 LenEE. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B' LenEE_B' : length EE_B' N ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope1::EE6 = []::EE_B'. Subgoal 7.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B' LenEE_B' : length EE_B' N ============================ Scope1::EE6 = []::EE_B'
< NNS': case NNS'. Subgoal 7.2.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' N1 SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N1 (Scope1::EE6) EE_B' NNS'2 : take N1 (Scope1::EE6) [[]] NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ Scope1::EE6 = []::EE_B'
< Take: case NNS'2. Subgoal 7.2.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' N1 SNames BNames N2 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N1 ([]::EE6) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 EE6 [] ============================ []::EE6 = []::EE_B'
< case Take1. Subgoal 7.2.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' N1 SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N1 ([]::EE6) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ []::EE6 = []::EE_B'
< compute Take. Subgoal 7.2.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop 1 ([]::EE6) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::EE6 = []::EE_B'
< Drop: case NNS'1. Subgoal 7.2.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' SNames BNames N3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 EE6 EE_B' ============================ []::EE6 = []::EE_B'
< Drop': case Drop1. Subgoal 7.2.1.1: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ []::EE_B' = []::EE_B'
< search. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L EE_B' ============================ []::(X::L) = []::EE_B'
< G: apply drop_geq_0 to Drop'1. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L EE_B' G : N4 >= 0 ============================ []::(X::L) = []::EE_B'
< P': assert 1 + -1 = 0. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L EE_B' G : N4 >= 0 P' : 1 + -1 = 0 ============================ []::(X::L) = []::EE_B'
< apply drop_is_integer to Drop'1. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L EE_B' G : N4 >= 0 P' : 1 + -1 = 0 H2 : is_integer N4 ============================ []::(X::L) = []::EE_B'
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop' : 1 + N4 = N3 Drop'1 : drop N4 L EE_B' G : N4 >= 0 P' : 1 + -1 = 0 H2 : is_integer N4 H3 : is_integer N3 ============================ []::(X::L) = []::EE_B'
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N4 L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N4 = 0 Drop'1 : drop N4 L EE_B' G : N4 >= 0 P' : 1 + -1 = 0 H2 : is_integer N4 H3 : is_integer 0 ============================ []::(X::L) = []::EE_B'
< apply plus_integer_unique_addend to _ _ _ Drop' P'. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B' G : -1 >= 0 P' : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 ============================ []::(X::L) = []::EE_B'
< L: case G. Subgoal 7.2.1.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames L X Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L EE_B' P' : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 L : 0 <= -1 ============================ []::(X::L) = []::EE_B'
< case L. Subgoal 7.2.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1 LenEE_B' : length (Scope1::BR) N NNS' : newNameScopes [[]] N EE6 BR ============================ Scope1::EE6 = []::(Scope1::BR)
< LenBR: case LenEE_B'. Subgoal 7.2.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1 NNS' : newNameScopes [[]] N EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ Scope1::EE6 = []::(Scope1::BR)
< apply length_is to LenBR. Subgoal 7.2.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1 NNS' : newNameScopes [[]] N EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' ============================ Scope1::EE6 = []::(Scope1::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 7.2.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1 NNS' : newNameScopes [[]] N EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' LEq : N <= N' ============================ Scope1::EE6 = []::(Scope1::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 7.2.2: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1 NNS' : newNameScopes [[]] N EE6 BR LenBR : length BR N' LenBR1 : 1 + N' = N H2 : is_integer N' LEq : N <= N' L : N' < N ============================ Scope1::EE6 = []::(Scope1::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1 Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B' LenEE_B' : length EE_B' N Eq : Scope1::EE6 = []::EE_B' ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< NEq: assert SaveL = Len -> false. Subgoal 7.3: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N ============================ SaveL = Len -> false
< intros E. Subgoal 7.3: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N E : SaveL = Len ============================ false
< case E. Subgoal 7.3: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names Len Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N ============================ false
< AppLen: apply fresh_name_start to _ Pr2. Subgoal 7.3: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names Len Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = Len ============================ false
< FrL: case Pr1. Subgoal 7.3.1: Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names "L" H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes "L" (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([("L", intVal 0), ("L", V1)]::EE_B') (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = "L" FrL : not_mem "L" Names ============================ false
< App: case AppLen. Subgoal 7.3.1: Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L") Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names "L" H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes "L" (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([("L", intVal 0), ("L", V1)]::EE_B') (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N FrL : not_mem "L" Names App : "en" ++ S = [] ============================ false
< case App. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S NewBase Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL1 : "L" ++ "_" = NewBase FrL2 : fresh_name NewBase Names Len ============================ false
< AppL: case FrL1. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S L3 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name ("L"::L3) Names Len AppL : [] ++ "_" = L3 ============================ false
< case AppL. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name "L_" Names Len ============================ false
< AppL: apply fresh_name_start to _ FrL2. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S S1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = Len FrL : mem "L" Names FrL2 : fresh_name "L_" Names Len AppL : "L_" ++ S1 = Len ============================ false
< AppL: case AppL. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L1 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::L1) E1) (seq (declare intTy ("L"::L1) (num 0)) (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))))) (name ("L"::L1)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names ("L"::L1) H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes ("L"::L1) (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([("L"::L1, intVal 0), ("L"::L1, V1)]::EE_B') (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = "L"::L1 FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::L1) AppL : "_" ++ S1 = L1 ============================ false
< case AppL. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names ("L"::("_"::L4)) H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes ("L"::("_"::L4)) (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE_B') (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N AppLen : "Len" ++ S = "L"::("_"::L4) FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::("_"::L4)) H2 : [] ++ S1 = L4 ============================ false
< AppLen: case AppLen. Subgoal 7.3.2: Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L4 Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr2 : fresh_name "Len" Names ("L"::("_"::L4)) H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes ("L"::("_"::L4)) (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE_B') (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N FrL : mem "L" Names FrL2 : fresh_name "L_" Names ("L"::("_"::L4)) H2 : [] ++ S1 = L4 AppLen : "en" ++ S = "_"::L4 ============================ false
< case AppLen. Subgoal 7: Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope::EE') V Ev3 : O1 ++ O4 = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4 LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
< LL: apply while_to_length to Ev4 Ev1 _ NEq. Subgoal 7: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen CurrLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 CurrLen LL1 : is_integer CurrLen LL2 : CurrLen + 0 = TotalLen ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\ scopes_same EE_B' EE''
< P: apply plus_integer_comm to _ _ LL2. Subgoal 7: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen CurrLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 CurrLen LL1 : is_integer CurrLen LL2 : CurrLen + 0 = TotalLen P : 0 + CurrLen = TotalLen ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\ scopes_same EE_B' EE''
< case P. Subgoal 7: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen ============================ exists EE'', evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\ scopes_same EE_B' EE''
< exists EE_B'. Subgoal 7: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen ============================ evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O /\ scopes_same EE_B' EE_B'
< split. Subgoal 7.4: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen ============================ evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O
< apply append_nil_right to Ev3. Subgoal 7.4: Variables: Names FE EE O Ctx Len SaveL E1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen ============================ evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O
< search. Subgoal 7.5: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen ============================ scopes_same EE_B' EE_B'
< apply evalExpr_isCtx to _ _ _ Ev_E1. Subgoal 7.5: Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "L" Names SaveL Pr2 : fresh_name "Len" Names Len H1 : is_expr E1 EN : exprNames Ctx E1 [] Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen) Ev3 : O1 ++ [] = O Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1 Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') [] LenEE : length EE N NNS : newNameScopes [[]] N ([]::EE) EE Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1 NNS' : newNameScopes [[]] N ([]::EE_B') EE_B' LenEE_B' : length EE_B' N NEq : SaveL = Len -> false LL : listLength V1 TotalLen LL1 : is_integer TotalLen LL2 : TotalLen + 0 = TotalLen H2 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ scopes_same EE_B' EE_B'
< backchain scopes_same_reflexive. Proof completed.
< Theorem drop_one [A] : forall (D : list A) (L : list A), drop 1 L D -> exists S, L = S::D. ============================ forall D L, drop 1 L D -> exists S, L = S::D
< intros D. Variables: D L D : drop 1 L D ============================ exists S, L = S::D
< D: case D. Variables: D N1 L1 X D : 1 + N1 = 1 D1 : drop N1 L1 D ============================ exists S, X::L1 = S::D
< apply drop_is_integer to D1. Variables: D N1 L1 X D : 1 + N1 = 1 D1 : drop N1 L1 D H1 : is_integer N1 ============================ exists S, X::L1 = S::D
< D': case D1. Subgoal 1: Variables: D X D : 1 + 0 = 1 H1 : is_integer 0 ============================ exists S, X::D = S::D
< search. Subgoal 2: Variables: D N1 X N2 L2 X1 D : 1 + N1 = 1 H1 : is_integer N1 D' : 1 + N2 = N1 D'1 : drop N2 L2 D ============================ exists S, X::(X1::L2) = S::D
< apply drop_is_integer to D'1. Subgoal 2: Variables: D N1 X N2 L2 X1 D : 1 + N1 = 1 H1 : is_integer N1 D' : 1 + N2 = N1 D'1 : drop N2 L2 D H2 : is_integer N2 ============================ exists S, X::(X1::L2) = S::D
< P: assert 1 + 0 = 1. Subgoal 2: Variables: D N1 X N2 L2 X1 D : 1 + N1 = 1 H1 : is_integer N1 D' : 1 + N2 = N1 D'1 : drop N2 L2 D H2 : is_integer N2 P : 1 + 0 = 1 ============================ exists S, X::(X1::L2) = S::D
< apply plus_integer_unique_addend to _ _ _ D P. Subgoal 2: Variables: D X N2 L2 X1 D : 1 + 0 = 1 H1 : is_integer 0 D' : 1 + N2 = 0 D'1 : drop N2 L2 D H2 : is_integer N2 P : 1 + 0 = 1 ============================ exists S, X::(X1::L2) = S::D
< P': assert 1 + -1 = 0. Subgoal 2: Variables: D X N2 L2 X1 D : 1 + 0 = 1 H1 : is_integer 0 D' : 1 + N2 = 0 D'1 : drop N2 L2 D H2 : is_integer N2 P : 1 + 0 = 1 P' : 1 + -1 = 0 ============================ exists S, X::(X1::L2) = S::D
< apply plus_integer_unique_addend to _ _ _ D' P'. Subgoal 2: Variables: D X L2 X1 D : 1 + 0 = 1 H1 : is_integer 0 D' : 1 + -1 = 0 D'1 : drop -1 L2 D H2 : is_integer -1 P : 1 + 0 = 1 P' : 1 + -1 = 0 ============================ exists S, X::(X1::L2) = S::D
< GEq: apply drop_geq_0 to D'1. Subgoal 2: Variables: D X L2 X1 D : 1 + 0 = 1 H1 : is_integer 0 D' : 1 + -1 = 0 D'1 : drop -1 L2 D H2 : is_integer -1 P : 1 + 0 = 1 P' : 1 + -1 = 0 GEq : -1 >= 0 ============================ exists S, X::(X1::L2) = S::D
< LEq: case GEq. Subgoal 2: Variables: D X L2 X1 D : 1 + 0 = 1 H1 : is_integer 0 D' : 1 + -1 = 0 D'1 : drop -1 L2 D H2 : is_integer -1 P : 1 + 0 = 1 P' : 1 + -1 = 0 LEq : 0 <= -1 ============================ exists S, X::(X1::L2) = S::D
< case LEq. Proof completed.
< Theorem eval_while_names_same : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O -> names_same EE EE'. ============================ forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O -> names_same EE EE'
< induction on 5. IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' ============================ forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O @ -> names_same EE EE'
< intros IsC IsB IsFE IsEE Ev. Variables: C B FE EE EE' O IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (while C B) EE' O @ ============================ names_same EE EE'
< Ev: case Ev. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O ============================ names_same EE EE'
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12 IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 * Ev2 : evalStmt FE EE4 (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ names_same EE EE'
< NS1: apply evalStmt_names_same to _ _ _ Ev1. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' ============================ names_same EE EE'
< Is+: apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' Is+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ names_same EE EE'
< case Is+. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' H2 : is_list (is_pair is_string is_value) Scope' H3 : is_list (is_list (is_pair is_string is_value)) EE'' ============================ names_same EE EE'
< NS2: apply IH to _ _ _ _ Ev2. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' H2 : is_list (is_pair is_string is_value) Scope' H3 : is_list (is_list (is_pair is_string is_value)) EE'' NS2 : names_same EE'' EE' ============================ names_same EE EE'
< NS': apply names_same_transitive to NS NS1. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' H2 : is_list (is_pair is_string is_value) Scope' H3 : is_list (is_list (is_pair is_string is_value)) EE'' NS2 : names_same EE'' EE' NS' : names_same EE EE'' ============================ names_same EE EE'
< apply names_same_transitive to NS' NS2. Subgoal 1: Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE'' IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C trueVal EE2 O2 * Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 * Ev2 : evalStmt FE EE'' (while C B) EE' O4 * Ev3 : O2 ++ O3 = O12 Ev4 : O12 ++ O4 = O NS : names_same EE EE2 H1 : is_list (is_list (is_pair is_string is_value)) EE2 NS1 : names_same EE2 EE'' H2 : is_list (is_pair is_string is_value) Scope' H3 : is_list (is_list (is_pair is_string is_value)) EE'' NS2 : names_same EE'' EE' NS' : names_same EE EE'' H4 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 2: Variables: C B FE EE EE' O IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C falseVal EE' O * ============================ names_same EE EE'
< apply evalExpr_names_same to _ _ _ Ev. Subgoal 2: Variables: C B FE EE EE' O IH : forall C B FE EE EE' O, is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * -> names_same EE EE' IsC : is_expr C IsB : is_stmt B IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE C falseVal EE' O * H1 : names_same EE EE' ============================ names_same EE EE'
< search. Proof completed.
< Theorem names_lookupScopes : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names -> mem X Names -> exists V, lookupScopes X Ctx V. ============================ forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names -> mem X Names -> exists V, lookupScopes X Ctx V
< induction on 2. IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V ============================ forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names @ -> mem X Names -> exists V, lookupScopes X Ctx V
< intros IsCtx Names Mem. Variables: Ctx X Names IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V IsCtx : is_list (is_list (is_pair is_string is_value)) Ctx Names : names Ctx Names @ Mem : mem X Names ============================ exists V, lookupScopes X Ctx V
< apply names_is to _ Names. Variables: Ctx X Names IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V IsCtx : is_list (is_list (is_pair is_string is_value)) Ctx Names : names Ctx Names @ Mem : mem X Names H1 : is_list is_string Names ============================ exists V, lookupScopes X Ctx V
< Names: case Names. Subgoal 1: Variables: X IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V IsCtx : is_list (is_list (is_pair is_string is_value)) [] Mem : mem X [] H1 : is_list is_string [] ============================ exists V, lookupScopes X [] V
< case Mem. Subgoal 2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V IsCtx : is_list (is_list (is_pair is_string is_value)) (Scope::Rest) Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names ============================ exists V, lookupScopes X (Scope::Rest) V
< Is: case IsCtx. Subgoal 2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest ============================ exists V, lookupScopes X (Scope::Rest) V
< IsX: apply mem_is_string to _ Mem. Subgoal 2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X ============================ exists V, lookupScopes X (Scope::Rest) V
< Or: apply mem_append to Mem Names2. Subgoal 2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X Or : mem X NScope \/ mem X NRest ============================ exists V, lookupScopes X (Scope::Rest) V
< M: case Or. Subgoal 2.1: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NScope ============================ exists V, lookupScopes X (Scope::Rest) V
< MXB: apply mem_domain to Names M. Subgoal 2.1: Variables: X Names NScope NRest Rest Scope B IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NScope MXB : mem (X, B) Scope ============================ exists V, lookupScopes X (Scope::Rest) V
< L: apply mem_lookup to _ MXB. Subgoal 2.1: Variables: X Names NScope NRest Rest Scope B V' IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NScope MXB : mem (X, B) Scope L : lookup Scope X V' ============================ exists V, lookupScopes X (Scope::Rest) V
< search. Subgoal 2.2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NRest ============================ exists V, lookupScopes X (Scope::Rest) V
< Or: apply lookup_string_value_list_or_no to Is IsX. Subgoal 2.2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NRest Or : (exists V, lookup Scope X V) \/ no_lookup Scope X ============================ exists V, lookupScopes X (Scope::Rest) V
< case Or. Subgoal 2.2.1: Variables: X Names NScope NRest Rest Scope V IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NRest H2 : lookup Scope X V ============================ exists V, lookupScopes X (Scope::Rest) V
< search. Subgoal 2.2.2: Variables: X Names NScope NRest Rest Scope IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NRest H2 : no_lookup Scope X ============================ exists V, lookupScopes X (Scope::Rest) V
< LS: apply IH to _ Names1 M. Subgoal 2.2.2: Variables: X Names NScope NRest Rest Scope V IH : forall Ctx X Names, is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * -> mem X Names -> exists V, lookupScopes X Ctx V Mem : mem X Names H1 : is_list is_string Names Names : domain Scope NScope Names1 : names Rest NRest * Names2 : NScope ++ NRest = Names Is : is_list (is_pair is_string is_value) Scope Is1 : is_list (is_list (is_pair is_string is_value)) Rest IsX : is_string X M : mem X NRest H2 : no_lookup Scope X LS : lookupScopes X Rest V ============================ exists V, lookupScopes X (Scope::Rest) V
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Is: case IsS. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert SaveE = L -> false. Subgoal 1.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O ============================ SaveE = L -> false
< intros E. Subgoal 1.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O E : SaveE = L ============================ false
< case E. Subgoal 1.1: Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) L Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O ============================ false
< apply fresh_name_not_mem to Pr3 _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert SaveI = L -> false. Subgoal 1.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false ============================ SaveI = L -> false
< intros E. Subgoal 1.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false E : SaveI = L ============================ false
< case E. Subgoal 1.2: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) L Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert Hold = L -> false. Subgoal 1.3: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false ============================ Hold = L -> false
< intros E. Subgoal 1.3: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false E : Hold = L ============================ false
< case E. Subgoal 1.3: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) L Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false ============================ false
< apply fresh_name_not_mem to Pr2 _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert Copy = L -> false. Subgoal 1.4: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false ============================ Copy = L -> false
< intros E. Subgoal 1.4: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false E : Copy = L ============================ false
< case E. Subgoal 1.4: Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) L Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false ============================ false
< apply fresh_name_not_mem to Pr4 _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert Hold = SaveE -> false. Subgoal 1.5: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false ============================ Hold = SaveE -> false
< intros E. Subgoal 1.5: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false E : Hold = SaveE ============================ false
< case E. Subgoal 1.5: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveE = L -> false H4 : Copy = L -> false ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.5: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveE = L -> false H4 : Copy = L -> false AppE : "E" ++ S1 = SaveE ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.5.1: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveE = L -> false H4 : Copy = L -> false AppE : "E" ++ S1 = SaveE ============================ is_string "Hold"
< search 6. Subgoal 1.5: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveE = L -> false H4 : Copy = L -> false AppE : "E" ++ S1 = SaveE AppH : "Hold" ++ S2 = SaveE ============================ false
< case AppE. Subgoal 1.5: Variables: Names FE EE EE' O Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("E"::L3) Pr3 : fresh_name "E" (L::Names) ("E"::L3) Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : "E"::L3 = L -> false H2 : SaveI = L -> false H3 : "E"::L3 = L -> false H4 : Copy = L -> false AppH : "Hold" ++ S2 = "E"::L3 H5 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert Hold = SaveI -> false. Subgoal 1.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false ============================ Hold = SaveI -> false
< intros E. Subgoal 1.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false E : Hold = SaveI ============================ false
< case E. Subgoal 1.6: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveI = L -> false H4 : Copy = L -> false H5 : SaveI = SaveE -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.6: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveI = L -> false H4 : Copy = L -> false H5 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.6.1: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveI = L -> false H4 : Copy = L -> false H5 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI ============================ is_string "Hold"
< search 6. Subgoal 1.6: Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : SaveI = L -> false H4 : Copy = L -> false H5 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI AppH : "Hold" ++ S2 = SaveI ============================ false
< case AppI. Subgoal 1.6: Variables: Names FE EE EE' O Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) ("I"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : "I"::L3 = L -> false H3 : "I"::L3 = L -> false H4 : Copy = L -> false H5 : "I"::L3 = SaveE -> false AppH : "Hold" ++ S2 = "I"::L3 H6 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NEqIE: assert SaveI = SaveE -> false. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false ============================ SaveI = SaveE -> false
< intros E. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false E : SaveI = SaveE ============================ false
< case E. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveE Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveE = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveE -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveE Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveE = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveE -> false AppI : "I" ++ S1 = SaveE ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveE Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveE = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveE -> false AppI : "I" ++ S1 = SaveE AppE : "E" ++ S2 = SaveE ============================ false
< case AppI. Subgoal 1.7: Variables: Names FE EE EE' O Hold Copy L E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("I"::L3) Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : "I"::L3 = L -> false H2 : "I"::L3 = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = "I"::L3 -> false H6 : Hold = "I"::L3 -> false AppE : "E" ++ S2 = "I"::L3 H7 : [] ++ S1 = L3 ============================ false
< case AppE. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert Copy = Hold -> false. Subgoal 1.8: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ Copy = Hold -> false
< intros E. Subgoal 1.8: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false E : Copy = Hold ============================ false
< case E. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Hold = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Hold = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.8.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Hold = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold ============================ is_string "Hold"
< search 6. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Hold = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold AppH : "Hold" ++ S2 = Hold ============================ false
< case AppC. Subgoal 1.8: Variables: Names FE EE EE' O L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("C"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("C"::L3) Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : "C"::L3 = L -> false H4 : "C"::L3 = L -> false H5 : "C"::L3 = SaveE -> false H6 : "C"::L3 = SaveI -> false NEqIE : SaveI = SaveE -> false AppH : "Hold" ++ S2 = "C"::L3 H7 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert SaveE = Copy -> false. Subgoal 1.9: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false ============================ SaveE = Copy -> false
< intros E. Subgoal 1.9: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false E : SaveE = Copy ============================ false
< case E. Subgoal 1.9: Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) Copy Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : Copy = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = Copy -> false H6 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H7 : Copy = Hold -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.9: Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) Copy Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : Copy = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = Copy -> false H6 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H7 : Copy = Hold -> false AppC : "C" ++ S1 = Copy ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.9: Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) Copy Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : Copy = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = Copy -> false H6 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H7 : Copy = Hold -> false AppC : "C" ++ S1 = Copy AppE : "E" ++ S2 = Copy ============================ false
< case AppC. Subgoal 1.9: Variables: Names FE EE EE' O Hold L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("C"::L3) Pr4 : fresh_name "C" (L::Names) ("C"::L3) Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : "C"::L3 = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : "C"::L3 = L -> false H5 : Hold = "C"::L3 -> false H6 : Hold = SaveI -> false NEqIE : SaveI = "C"::L3 -> false H7 : "C"::L3 = Hold -> false AppE : "E" ++ S2 = "C"::L3 H8 : [] ++ S1 = L3 ============================ false
< case AppE. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< assert SaveI = Copy -> false. Subgoal 1.10: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false ============================ SaveI = Copy -> false
< intros E. Subgoal 1.10: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false E : SaveI = Copy ============================ false
< case E. Subgoal 1.10: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) Copy Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : Copy = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.10: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) Copy Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : Copy = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false AppC : "C" ++ S1 = Copy ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.10: Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) Copy Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : Copy = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false AppC : "C" ++ S1 = Copy AppI : "I" ++ S2 = Copy ============================ false
< case AppC. Subgoal 1.10: Variables: Names FE EE EE' O Hold L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("C"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("C"::L3) (name ("C"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("C"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("C"::L3) (minus (name ("C"::L3)) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) ("C"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("C"::L3) Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : "C"::L3 = L -> false H3 : Hold = L -> false H4 : "C"::L3 = L -> false H5 : Hold = SaveE -> false H6 : Hold = "C"::L3 -> false NEqIE : "C"::L3 = SaveE -> false H7 : "C"::L3 = Hold -> false H8 : SaveE = "C"::L3 -> false AppI : "I" ++ S2 = "C"::L3 H9 : [] ++ S1 = L3 ============================ false
< case AppI. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< rename N1 to Len. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] Len ([]::EE) EE. Subgoal 1.11: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ newNameScopes [[]] Len ([]::EE) EE
< unfold . Subgoal 1.11: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 1.11: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 1.11.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ length EE Len
< search. Subgoal 1.11.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ drop 1 ([]::EE) EE
< search. Subgoal 1.11.3: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ take 1 ([]::EE) [[]]
< search. Subgoal 1.11.4: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ names [[]] []
< search. Subgoal 1.11.5: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ names EE Names
< search. Subgoal 1.11.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 1.11.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len M : mem X [] H10 : mem X Names ============================ false
< case M. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvI': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI' Ev _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_A' = []::EE2. Subgoal 1.12: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 ============================ EE_A' = []::EE2
< NNS': case NNS'. Subgoal 1.12.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' N1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2 NNS' : length EE2 Len NNS'1 : drop N1 EE_A' EE2 NNS'2 : take N1 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE2
< Take: case NNS'2. Subgoal 1.12.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames N2 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop N1 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L1 [] ============================ []::L1 = []::EE2
< case Take1. Subgoal 1.12.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop N1 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ []::L1 = []::EE2
< compute Take. Subgoal 1.12.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len SNames BNames L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop 1 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L1 = []::EE2
< apply drop_one to NNS'1. Subgoal 1.12.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : length EE2 Len NNS'1 : drop 1 ([]::EE2) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::EE2 = []::EE2
< search. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR ============================ S1::AR = []::(S1::BR)
< LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR+ : length (S1::BR) Len ============================ S1::AR = []::(S1::BR)
< LenBR: case LenBR+. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ S1::AR = []::(S1::BR)
< apply length_is to LenBR. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' ============================ S1::AR = []::(S1::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len ============================ S1::AR = []::(S1::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.12.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len LEq : Len <= N' ============================ S1::AR = []::(S1::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 Eq : EE_A' = []::EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvAI: assert evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< IsEE2: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Names2: apply names_exists to IsEE2. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Len2: apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NNS+: assert newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2. Subgoal 1.13: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
< unfold . Subgoal 1.13: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ exists N1 SNames BNames, ((((length EE2 Len /\ drop N1 ([(SaveI, intVal N)]::EE2) EE2) /\ take N1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]) /\ names [[(SaveI, intVal N)]] SNames) /\ names EE2 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveI], N1. Subgoal 1.13: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ ((((length EE2 Len /\ drop 1 ([(SaveI, intVal N)]::EE2) EE2) /\ take 1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]) /\ names [[(SaveI, intVal N)]] [SaveI]) /\ names EE2 N1) /\ (forall X, mem X [SaveI] -> mem X N1 -> false)
< split. Subgoal 1.13.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ length EE2 Len
< search. Subgoal 1.13.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ drop 1 ([(SaveI, intVal N)]::EE2) EE2
< search. Subgoal 1.13.3: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ take 1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]
< search. Subgoal 1.13.4: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ names [[(SaveI, intVal N)]] [SaveI]
< search. Subgoal 1.13.5: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ names EE2 N1
< search. Subgoal 1.13.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len ============================ forall X, mem X [SaveI] -> mem X N1 -> false
< intros M MX. Subgoal 1.13.6: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len M : mem X [SaveI] MX : mem X N1 ============================ false
< M: case M. Subgoal 1.13.6.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N1 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 1.13.6.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N1 NS' : names_same EE2 EE ============================ false
< M': apply names_same_names to NS' Names2 Names MX. Subgoal 1.13.6.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N1 NS' : names_same EE2 EE M' : mem SaveI Names ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 1.13.6.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem X N1 M : mem X [] ============================ false
< case M. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvE': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS+. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE' Ev1 _. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Len4: apply evalExpr_keep_scopes to _ _ _ Ev1 Len2. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4 Len4 : length EE4 Len ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_A'1 = [(SaveI, intVal N)]::EE4. Subgoal 1.14: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4 Len4 : length EE4 Len ============================ EE_A'1 = [(SaveI, intVal N)]::EE4
< NN: case NNS''. Subgoal 1.14.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 N2 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N2 EE_A'1 EE4 NN2 : take N2 EE_A'1 [[(SaveI, intVal N)]] NN3 : names [[(SaveI, intVal N)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A'1 = [(SaveI, intVal N)]::EE4
< Take: case NN2. Subgoal 1.14.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 N2 SNames BNames N3 L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N2 ([(SaveI, intVal N)]::L1) EE4 NN3 : names [[(SaveI, intVal N)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L1 [] ============================ [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
< Take: case Take1. Subgoal 1.14.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 N2 SNames BNames L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N2 ([(SaveI, intVal N)]::L1) EE4 NN3 : names [[(SaveI, intVal N)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N2 ============================ [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
< compute Take. Subgoal 1.14.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames L1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop 1 ([(SaveI, intVal N)]::L1) EE4 NN3 : names [[(SaveI, intVal N)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
< apply drop_one to NN1. Subgoal 1.14.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop 1 ([(SaveI, intVal N)]::EE4) EE4 NN3 : names [[(SaveI, intVal N)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, intVal N)]::EE4 = [(SaveI, intVal N)]::EE4
< search. Subgoal 1.14.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 Ev2 : lookupScopes L (S1::BR) LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 (S1::BR) EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3 Len4 : length (S1::BR) Len NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR ============================ S1::AR = [(SaveI, intVal N)]::(S1::BR)
< LenBR: case Len4. Subgoal 1.14.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 Ev2 : lookupScopes L (S1::BR) LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 (S1::BR) EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ S1::AR = [(SaveI, intVal N)]::(S1::BR)
< apply length_is to LenBR. Subgoal 1.14.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 Ev2 : lookupScopes L (S1::BR) LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 (S1::BR) EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H12 : is_integer N' ============================ S1::AR = [(SaveI, intVal N)]::(S1::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.14.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 Ev2 : lookupScopes L (S1::BR) LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 (S1::BR) EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H12 : is_integer N' L : N' < Len ============================ S1::AR = [(SaveI, intVal N)]::(S1::BR)
< LEq: apply newNameScopes_length to NN LenBR. Subgoal 1.14.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 Ev2 : lookupScopes L (S1::BR) LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 (S1::BR) EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H12 : is_integer N' L : N' < Len LEq : Len <= N' ============================ S1::AR = [(SaveI, intVal N)]::(S1::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4 Len4 : length EE4 Len Eq : EE_A'1 = [(SaveI, intVal N)]::EE4 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvAE: assert evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr3. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< IsEE4: apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvMI: assert evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []. Subgoal 1.15: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
< assert SaveE = SaveI -> false. Subgoal 1.15.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ SaveE = SaveI -> false
< intros E. Subgoal 1.15.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 E : SaveE = SaveI ============================ false
< case E. Subgoal 1.15.1: Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveI Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveI = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveI -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveI -> false H7 : Copy = Hold -> false H8 : SaveI = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveI H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ false
< backchain NEqIE. Subgoal 1.15: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 H14 : SaveE = SaveI -> false ============================ evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
< search. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< EvH: assert evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (exactEval:list:nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< IsSaveI: apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< IsHold: apply fresh_name_is to _ Pr2. Subgoal 1.16: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< IsCopy: apply fresh_name_is to _ Pr4. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< GEq: apply updateListIndex_pos to Ev3. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with OldL = LV I = N V = V NewL = LV2 Hold = Hold Copy = Copy SaveI = SaveI SaveE = SaveE G = EE4 L = L HoldL = recVal [("null", trueVal)]. Subgoal 1.17: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4)
< search 12. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< apply drop_proj_rel_evalStmt to Main. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\ scopes_same EE' EE''
< exists G'. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\ scopes_same EE' G'
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\ scopes_same EE' G'
< apply is_list_values_append_nil to IsO3. Subgoal 1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\ scopes_same EE' G'
< split. Subgoal 1.18: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O
< search 20. Subgoal 1.19: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 ============================ scopes_same EE' G'
< FO: case Main3. Subgoal 1.19.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 G' LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV1 Ev4 : replaceScopes L LV1 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" trueVal ============================ scopes_same EE' G'
< apply replaceScopes_unique to Main2 Ev4. Subgoal 1.19.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV1 Ev4 : replaceScopes L LV1 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 EE' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" trueVal ============================ scopes_same EE' EE'
< apply lookupScopes_is to _ Ev2. Subgoal 1.19.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV1 Ev4 : replaceScopes L LV1 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 EE' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" trueVal H17 : is_value LV H18 : is_string L ============================ scopes_same EE' EE'
< apply updateListIndex_is to _ _ Ev3. Subgoal 1.19.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV1 Ev4 : replaceScopes L LV1 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 EE' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" trueVal H17 : is_value LV H18 : is_string L H19 : is_value LV1 ============================ scopes_same EE' EE'
< apply replaceScopes_is to _ _ Main2. Subgoal 1.19.1: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV1 Ev4 : replaceScopes L LV1 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 EE' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" trueVal H17 : is_value LV H18 : is_string L H19 : is_value LV1 H20 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 1.19.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Fields' T Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO : lookup [("null", trueVal)] "null" falseVal FO1 : lookup [("null", trueVal)] "tail" T FO2 : replaceRecVal "tail" LV2 [("null", trueVal)] Fields' FO3 : flipOnto T (recVal Fields') LV1 ============================ scopes_same EE' G'
< L: case FO. Subgoal 1.19.2: Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Fields' T Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 Ev2 : lookupScopes L EE4 LV Ev3 : updateListIndex LV N V LV2 Ev4 : replaceScopes L LV2 EE4 EE' Ev5 : O2 ++ O3 = O H1 : SaveE = L -> false H2 : SaveI = L -> false H3 : Hold = L -> false H4 : Copy = L -> false H5 : Hold = SaveE -> false H6 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H7 : Copy = Hold -> false H8 : SaveE = Copy -> false H9 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2 H10 : is_string SaveI H11 : is_value (intVal N) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N1 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2 EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4 Len4 : length EE4 Len EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3 H12 : is_string SaveE H13 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [] EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N >= 0 H14 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H16 : O3 ++ [] = O3 FO1 : lookup [("null", trueVal)] "tail" T FO2 : replaceRecVal "tail" LV2 [("null", trueVal)] Fields' FO3 : flipOnto T (recVal Fields') LV1 L : "null" = "null" -> false L1 : lookup [] "null" falseVal ============================ scopes_same EE' G'
< apply L to _. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O Pr1 : fresh_name "L" (X::Names) SaveL ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< case IsS. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< NS': apply names_same_symmetric to NS. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< IsEE3: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Names3: apply names_exists to IsEE3. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< IsN: apply names_is to _ Names3. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Fr: apply fresh_name_exists to _ _ with Base = "L" Names = X::N. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_unique_mems to Fr Pr1 _ _. Subgoal 2.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ forall X1, mem X1 (X::Names) -> mem X1 (X::N)
< intros M. Subgoal 2.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 (X::Names) ============================ mem X1 (X::N)
< M: case M. Subgoal 2.1.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ mem X (X::N)
< search. Subgoal 2.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 Names ============================ mem X1 (X::N)
< apply names_same_names to NS Names Names3 M. Subgoal 2.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 Names H5 : mem X1 N ============================ mem X1 (X::N)
< search. Subgoal 2.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ forall X1, mem X1 (X::N) -> mem X1 (X::Names)
< intros M. Subgoal 2.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 (X::N) ============================ mem X1 (X::Names)
< M: case M. Subgoal 2.2.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ mem X (X::Names)
< search. Subgoal 2.2.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 N ============================ mem X1 (X::Names)
< apply names_same_names to NS' Names3 Names M. Subgoal 2.2.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) F M : mem X1 N H5 : mem X1 Names ============================ mem X1 (X::Names)
< search. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply iterateList_to_while to _ _ _ _ _ Ev1 Names3 Fr. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] N1 ([]::EE) EE. Subgoal 2.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ newNameScopes [[]] N1 ([]::EE) EE
< unfold . Subgoal 2.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ exists N SNames BNames, ((((length EE N1 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 2.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ ((((length EE N1 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 2.3.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ length EE N1
< search. Subgoal 2.3.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ drop 1 ([]::EE) EE
< search. Subgoal 2.3.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ take 1 ([]::EE) [[]]
< search. Subgoal 2.3.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ names [[]] []
< search. Subgoal 2.3.5: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ names EE Names
< search. Subgoal 2.3.6: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 2.3.6: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 M : mem X1 [] H6 : mem X1 Names ============================ false
< case M. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Ev': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV EE_A' O2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev' Ev NNS. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV EE_A' O2 NNS' : newNameScopes [[]] N1 EE_A' EE3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< NNS': case NNS'. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A' N2 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV EE_A' O2 NNS' : length EE3 N1 NNS'1 : drop N2 EE_A' EE3 NNS'2 : take N2 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Take: case NNS'2. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 N2 SNames BNames N3 L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'1 : drop N2 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L1 [] ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< case Take1. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 N2 SNames BNames L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'1 : drop N2 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N2 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< compute Take. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'1 : drop 1 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Drop: case NNS'1. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 N4 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L1 EE3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply drop_is_integer to Drop1. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 N4 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L1 EE3 H6 : is_integer N4 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE3 H6 : is_integer 0 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Eq: assert L1 = EE3. Subgoal 2.4.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE3 H6 : is_integer 0 ============================ L1 = EE3
< D: case Drop1. Subgoal 2.4.1.1: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L2 EE3 ============================ X1::L2 = EE3
< apply drop_is_integer to D1. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L2 EE3 H7 : is_integer N5 ============================ X1::L2 = EE3
< P: assert 1 + -1 = 0. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L2 EE3 H7 : is_integer N5 P : 1 + -1 = 0 ============================ X1::L2 = EE3
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE3 H7 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L2 = EE3
< GEq: apply drop_geq_0 to D1. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE3 H7 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X1::L2 = EE3
< LEq: case GEq. Subgoal 2.4.1.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE3 H7 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L2 = EE3
< case LEq. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE3 H6 : is_integer 0 Eq : L1 = EE3 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE3 EE3 H6 : is_integer 0 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< clear Take Drop Drop1. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 2.4: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O /\ scopes_same EE' EE'
< split. Subgoal 2.4.2: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
< search. Subgoal 2.4.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 ============================ scopes_same EE' EE'
< apply iterateList_isCtx to _ _ _ _ _ Ev1. Subgoal 2.4.3: Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV EE3 O2 Ev1 : iterateList FE EE3 LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE EE3 NS' : names_same EE3 EE IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names3 : names EE3 N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS' : length EE3 N1 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H6 : is_integer 0 H7 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< LenBR+: apply names_same_length to NS Len. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR LenBR+ : length (S1::BR) N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< LenBR: case LenBR+. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N1 LEq : N1 <= N' ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply length_is to LenBR. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N1 LEq : N1 <= N' H6 : is_integer N' ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< L: apply lt_plus_one to LenBR1 _. Subgoal 2.5: Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalExpr FE EE L LV (S1::BR) O2 Ev1 : iterateList FE (S1::BR) LV X Body EE' O3 Ev2 : O2 ++ O3 = O H4 : is_value LV NS : names_same EE (S1::BR) NS' : names_same (S1::BR) EE IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names3 : names (S1::BR) N IsN : is_list is_string N Fr : fresh_name "L" (X::N) SaveL H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS' : newNameScopes [[]] N1 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N1 LEq : N1 <= N' H6 : is_integer N' L : N' < N1 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply less_lesseq_flip_false to L LEq. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case IsS. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr3. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr2. Subgoal 1.1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr4. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqHI: assert Hold = SaveI -> false. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy ============================ Hold = SaveI -> false
< intros E. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy E : Hold = SaveI ============================ false
< case E. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string SaveI H7 : is_string Copy ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveI Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string SaveI H7 : is_string Copy AppI : "I" ++ S1 = SaveI ============================ false
< case AppI. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) ("I"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string SaveE H6 : is_string ("I"::L3) H7 : is_string Copy H8 : [] ++ S1 = L3 ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.2.1: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) ("I"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string SaveE H6 : is_string ("I"::L3) H7 : is_string Copy H8 : [] ++ S1 = L3 ============================ is_string "Hold"
< search 6. Subgoal 1.2: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) ("I"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string SaveE H6 : is_string ("I"::L3) H7 : is_string Copy H8 : [] ++ S1 = L3 AppH : "Hold" ++ S2 = "I"::L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqHL: assert Hold = L -> false. Subgoal 1.3: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false ============================ Hold = L -> false
< intros E. Subgoal 1.3: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false E : Hold = L ============================ false
< case E. Subgoal 1.3: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) L Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string L H7 : is_string Copy NEqHI : L = SaveI -> false ============================ false
< apply fresh_name_not_mem to Pr2 _. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqIE: assert SaveI = SaveE -> false. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false ============================ SaveI = SaveE -> false
< intros E. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false E : SaveI = SaveE ============================ false
< case E. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveE Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveE H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveE -> false NEqHL : Hold = L -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveE Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveE H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveE -> false NEqHL : Hold = L -> false AppI : "I" ++ S1 = SaveE ============================ false
< case AppI. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("I"::L3) Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string ("I"::L3) H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = "I"::L3 -> false NEqHL : Hold = L -> false H8 : [] ++ S1 = L3 ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.4: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("I"::L3) Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string ("I"::L3) H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = "I"::L3 -> false NEqHL : Hold = L -> false H8 : [] ++ S1 = L3 AppE : "E" ++ S2 = "I"::L3 ============================ false
< case AppE. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqIL: assert SaveI = L -> false. Subgoal 1.5: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false ============================ SaveI = L -> false
< intros E. Subgoal 1.5: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false E : SaveI = L ============================ false
< case E. Subgoal 1.5: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) L Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string L H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = L -> false NEqHL : Hold = L -> false NEqIE : L = SaveE -> false ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqHE: assert Hold = SaveE -> false. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false ============================ Hold = SaveE -> false
< intros E. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false E : Hold = SaveE ============================ false
< case E. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string SaveE H7 : is_string Copy NEqHI : SaveE = SaveI -> false NEqHL : SaveE = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) SaveE Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string SaveE H7 : is_string Copy NEqHI : SaveE = SaveI -> false NEqHL : SaveE = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false AppE : "E" ++ S1 = SaveE ============================ false
< case AppE. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("E"::L3) Pr3 : fresh_name "E" (L::Names) ("E"::L3) Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string ("E"::L3) H6 : is_string ("E"::L3) H7 : is_string Copy NEqHI : "E"::L3 = SaveI -> false NEqHL : "E"::L3 = L -> false NEqIE : SaveI = "E"::L3 -> false NEqIL : SaveI = L -> false H8 : [] ++ S1 = L3 ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.6.1: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("E"::L3) Pr3 : fresh_name "E" (L::Names) ("E"::L3) Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string ("E"::L3) H6 : is_string ("E"::L3) H7 : is_string Copy NEqHI : "E"::L3 = SaveI -> false NEqHL : "E"::L3 = L -> false NEqIE : SaveI = "E"::L3 -> false NEqIL : SaveI = L -> false H8 : [] ++ S1 = L3 ============================ is_string "Hold"
< search 6. Subgoal 1.6: Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("E"::L3) Pr3 : fresh_name "E" (L::Names) ("E"::L3) Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string ("E"::L3) H6 : is_string ("E"::L3) H7 : is_string Copy NEqHI : "E"::L3 = SaveI -> false NEqHL : "E"::L3 = L -> false NEqIE : SaveI = "E"::L3 -> false NEqIL : SaveI = L -> false H8 : [] ++ S1 = L3 AppH : "Hold" ++ S2 = "E"::L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqEL: assert SaveE = L -> false. Subgoal 1.7: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false ============================ SaveE = L -> false
< intros E. Subgoal 1.7: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false E : SaveE = L ============================ false
< case E. Subgoal 1.7: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) L Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string L H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = L -> false NEqIL : SaveI = L -> false NEqHE : Hold = L -> false ============================ false
< apply fresh_name_not_mem to Pr3 _. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqCH: assert Copy = Hold -> false. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false ============================ Copy = Hold -> false
< intros E. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false E : Copy = Hold ============================ false
< case E. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Hold NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Hold H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Hold NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false AppC : "C" ++ S1 = Hold ============================ false
< case AppC. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("C"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("C"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string ("C"::L3) H7 : is_string ("C"::L3) NEqHI : "C"::L3 = SaveI -> false NEqHL : "C"::L3 = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : "C"::L3 = SaveE -> false NEqEL : SaveE = L -> false H8 : [] ++ S1 = L3 ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 1.8.1: Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("C"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("C"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string ("C"::L3) H7 : is_string ("C"::L3) NEqHI : "C"::L3 = SaveI -> false NEqHL : "C"::L3 = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : "C"::L3 = SaveE -> false NEqEL : SaveE = L -> false H8 : [] ++ S1 = L3 ============================ is_string "Hold"
< search 6. Subgoal 1.8: Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3))))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) ("C"::L3) Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("C"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string ("C"::L3) H7 : is_string ("C"::L3) NEqHI : "C"::L3 = SaveI -> false NEqHL : "C"::L3 = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : "C"::L3 = SaveE -> false NEqEL : SaveE = L -> false H8 : [] ++ S1 = L3 AppH : "Hold" ++ S2 = "C"::L3 ============================ false
< case AppH. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqCL: assert Copy = L -> false. Subgoal 1.9: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false ============================ Copy = L -> false
< intros E. Subgoal 1.9: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false E : Copy = L ============================ false
< case E. Subgoal 1.9: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) L H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string L NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : L = Hold -> false ============================ false
< apply fresh_name_not_mem to Pr4 _. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqIC: assert SaveI = Copy -> false. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false ============================ SaveI = Copy -> false
< intros E. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false E : SaveI = Copy ============================ false
< case E. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) Copy Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string Copy H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = Copy -> false NEqHL : Hold = L -> false NEqIE : Copy = SaveE -> false NEqIL : Copy = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) Copy Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string Copy H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = Copy -> false NEqHL : Hold = L -> false NEqIE : Copy = SaveE -> false NEqIL : Copy = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false AppI : "I" ++ S1 = Copy ============================ false
< case AppI. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("I"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string SaveE H6 : is_string Hold H7 : is_string ("I"::L3) NEqHI : Hold = "I"::L3 -> false NEqHL : Hold = L -> false NEqIE : "I"::L3 = SaveE -> false NEqIL : "I"::L3 = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : "I"::L3 = Hold -> false NEqCL : "I"::L3 = L -> false H8 : [] ++ S1 = L3 ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.10: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) ("I"::L3) Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) ("I"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string ("I"::L3) H5 : is_string SaveE H6 : is_string Hold H7 : is_string ("I"::L3) NEqHI : Hold = "I"::L3 -> false NEqHL : Hold = L -> false NEqIE : "I"::L3 = SaveE -> false NEqIL : "I"::L3 = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : "I"::L3 = Hold -> false NEqCL : "I"::L3 = L -> false H8 : [] ++ S1 = L3 AppC : "C" ++ S2 = "I"::L3 ============================ false
< case AppC. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NEqEC: assert SaveE = Copy -> false. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false ============================ SaveE = Copy -> false
< intros E. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false E : SaveE = Copy ============================ false
< case E. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) Copy Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string Copy H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Copy -> false NEqIL : SaveI = L -> false NEqHE : Hold = Copy -> false NEqEL : Copy = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I S1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) Copy Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string Copy H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = Copy -> false NEqIL : SaveI = L -> false NEqHE : Hold = Copy -> false NEqEL : Copy = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false AppC : "C" ++ S1 = Copy ============================ false
< case AppC. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveI E I S1 L3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("C"::L3) Pr4 : fresh_name "C" (L::Names) ("C"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string ("C"::L3) H6 : is_string Hold H7 : is_string ("C"::L3) NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = "C"::L3 -> false NEqIL : SaveI = L -> false NEqHE : Hold = "C"::L3 -> false NEqEL : "C"::L3 = L -> false NEqCH : "C"::L3 = Hold -> false NEqCL : "C"::L3 = L -> false NEqIC : SaveI = "C"::L3 -> false H8 : [] ++ S1 = L3 ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 1.11: Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveI E I S1 L3 S2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) ("C"::L3) Pr4 : fresh_name "C" (L::Names) ("C"::L3) H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string ("C"::L3) H6 : is_string Hold H7 : is_string ("C"::L3) NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = "C"::L3 -> false NEqIL : SaveI = L -> false NEqHE : Hold = "C"::L3 -> false NEqEL : "C"::L3 = L -> false NEqCH : "C"::L3 = Hold -> false NEqCL : "C"::L3 = L -> false NEqIC : SaveI = "C"::L3 -> false H8 : [] ++ S1 = L3 AppE : "E" ++ S2 = "C"::L3 ============================ false
< case AppE. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listUpdate L I E) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< SN: case SN. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I NI NE Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I NI SN2 : exprNames Ctx' E NE SN3 : NI ++ NE = [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case SN3. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) (Scope::EE') O ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope EE3 O2 O3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev : evalStmt FE ([]::EE) (declare intTy SaveI I) EE3 O2 Ev1 : evalStmt FE EE3 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvI: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev1 : evalStmt FE (((SaveI, V)::Scope1)::EE2) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V EE1 O1 O4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev : evalStmt FE (((SaveI, V)::Scope1)::EE2) (declare intTy SaveE E) EE1 O1 Ev1 : evalStmt FE EE1 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) (Scope::EE') O4 Ev3 : O1 ++ O4 = O3 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvE: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev1 : evalStmt FE (((SaveE, V1)::Scope2)::EE5) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) (Scope::EE') O4 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O5 O6 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev : evalStmt FE (((SaveE, V1)::Scope2)::EE5) (assign SaveI (name SaveI)) EE4 O5 Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6 Ev4 : O5 ++ O6 = O4 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvMI: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O5 O6 V2 EE6 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6 Ev4 : O5 ++ O6 = O4 EvMI : evalExpr FE (((SaveE, V1)::Scope2)::EE5) (name SaveI) V2 EE6 O5 EvMI1 : replaceScopes SaveI V2 EE6 EE4 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LI: case EvMI. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4 LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2 EE7 O7 O8 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4 LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 Ev : evalStmt FE EE4 (declare intTy Hold (nil intTy)) EE7 O7 Ev1 : evalStmt FE EE7 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8 Ev5 : O7 ++ O8 = O6 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2 O7 O8 EE9 Scope3 V3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4 LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 Ev1 : evalStmt FE (((Hold, V3)::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8 Ev5 : O7 ++ O8 = O6 Ev : evalExpr FE EE4 (nil intTy) V3 (Scope3::EE9) O7 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 O8 EE9 Scope3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 Ev1 : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8 Ev5 : [] ++ O8 = O6 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Ev5. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 Ev1 : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O6 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvW: case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : evalStmt FE EE8 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) (Scope::EE') O10 EvW2 : O9 ++ O10 = O6 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ev: case EvW1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW2 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev1 : evalStmt FE EE10 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) (Scope::EE') O12 Ev5 : O11 ++ O12 = O10 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvA: case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW2 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvA1 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< rename EvW2 to EvW1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvA1 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< rename EvA1 to EvW2. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvNL: assert (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []. Subgoal 1.12: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 ============================ (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
< Ev: case Ev. Subgoal 1.12.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev : evalExpr FE EE8 (null (name L)) trueVal EE12 O15 Ev1 : evalStmt FE ([]::EE12) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) (Scope4::EE10) O16 Ev6 : O15 ++ O16 = O11 ============================ (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
< EvD: case Ev1. Subgoal 1.12.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 O16 Scope5 V4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev : evalExpr FE EE8 (null (name L)) trueVal EE12 O15 Ev6 : O15 ++ O16 = O11 EvD : evalExpr FE ([]::EE12) (errorExpr (stringLit "Invalid update") intTy) V4 (Scope5::EE10) O16 ============================ (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
< case EvD. Subgoal 1.12.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev : evalExpr FE EE8 (null (name L)) falseVal EE12 O15 Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16 Ev6 : O15 ++ O16 = O11 ============================ (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
< EvL: case Ev. Subgoal 1.12.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16 Fields Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16 Ev6 : O15 ++ O16 = O11 EvL : evalExpr FE EE8 (name L) (recVal Fields) EE12 O15 EvL1 : lookup Fields "null" falseVal ============================ (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
< case EvL. Subgoal 1.12.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 Scope4 O16 Fields Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16 Ev6 : [] ++ O16 = O11 EvL1 : lookup Fields "null" falseVal H8 : lookupScopes L EE12 (recVal Fields) ============================ (evalExpr FE EE12 (null (name L)) falseVal EE12 [] /\ EE10 = EE12) /\ O11 = []
< case Ev1. Subgoal 1.12.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O11 O12 EE11 O13 O14 Fields Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE10 O9 EvW1 : O9 ++ O10 = O6 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 Ev6 : [] ++ [] = O11 EvL1 : lookup Fields "null" falseVal H8 : lookupScopes L EE10 (recVal Fields) ============================ (evalExpr FE EE10 (null (name L)) falseVal EE10 [] /\ EE10 = EE10) /\ O11 = []
< case Ev6. Subgoal 1.12.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O12 EE11 O13 O14 Fields Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE10 O9 EvW1 : O9 ++ O10 = O6 Ev5 : [] ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 EvL1 : lookup Fields "null" falseVal H8 : lookupScopes L EE10 (recVal Fields) ============================ (evalExpr FE EE10 (null (name L)) falseVal EE10 [] /\ EE10 = EE10) /\ [] = []
< search. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11 Ev5 : O11 ++ O12 = O10 EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 EvNL : (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvNL: case EvNL. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 Ev4 : [] ++ O6 = O4 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O6 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] Ev5 : [] ++ O12 = O10 EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Ev4. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 O12 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] Ev5 : [] ++ O12 = O10 EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O12 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Ev5. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< ENI: apply exprNames_relatedCtxs to _ _ _ _ _ SN1 with CtxB = []::Ctx'. Subgoal 1.13: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ============================ forall X, mems X ([]::Ctx') -> mems X Ctx'
< intros M. Subgoal 1.13: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] M : mems X ([]::Ctx') ============================ mems X Ctx'
< M: case M. Subgoal 1.13.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] M : mem X [] ============================ mems X Ctx'
< case M. Subgoal 1.13.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] M : mems X Ctx' ============================ mems X Ctx'
< search. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply ctx_names_add_scope to Ctxs. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< IsEE2+: apply evalExpr_isCtx to _ _ _ EvI. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< IsEE2: case IsEE2+. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ctxs': apply evalExpr_ctx_names to _ _ _ _ _ ENI EvI. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx') ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Ctxs': case Ctxs'. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope1 = []. Subgoal 1.14: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' ============================ Scope1 = []
< Is: case IsEE2. Subgoal 1.14.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' ============================ [] = []
< search. Subgoal 1.14.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T H Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ((H::T)::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::(H::T))::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) (H::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) (H::T) Ctxs'2 : ctx_names EE2 Ctx' Is : is_pair is_string is_value H Is1 : is_list (is_pair is_string is_value) T ============================ H::T = []
< case Is. Subgoal 1.14.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T B A Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (((A, B)::T)::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::((A, B)::T))::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T) Ctxs'2 : ctx_names EE2 Ctx' Is1 : is_list (is_pair is_string is_value) T H9 : is_string A H10 : is_value B ============================ (A, B)::T = []
< M: apply Ctxs' to _ with K = A I = B. Subgoal 1.14.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T B A Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (((A, B)::T)::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::((A, B)::T))::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T) Ctxs'2 : ctx_names EE2 Ctx' Is1 : is_list (is_pair is_string is_value) T H9 : is_string A H10 : is_value B M : mem A [] ============================ (A, B)::T = []
< case M. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' Eq : Scope1 = [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ EvI. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE N ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< rename N to Len. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] Len ([]::EE) EE. Subgoal 1.15: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ newNameScopes [[]] Len ([]::EE) EE
< unfold . Subgoal 1.15: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 1.15: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 1.15.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ length EE Len
< search. Subgoal 1.15.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ drop 1 ([]::EE) EE
< search. Subgoal 1.15.3: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ take 1 ([]::EE) [[]]
< search. Subgoal 1.15.4: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ names [[]] []
< search. Subgoal 1.15.5: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ names EE Names
< search. Subgoal 1.15.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 1.15.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len M : mem X [] H10 : mem X Names ============================ false
< case M. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvI': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ SN1 EvI NNS. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LenEE2: apply evalExpr_keep_scopes to _ _ _ EvI' LenEE. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI EvI' NNS. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : newNameScopes [[]] Len ([]::EE2) EE_B' ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert EE_B' = EE2. Subgoal 1.16: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : newNameScopes [[]] Len ([]::EE2) EE_B' ============================ EE_B' = EE2
< NNS': case NNS'. Subgoal 1.16.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : length EE_B' Len NNS'1 : drop N ([]::EE2) EE_B' NNS'2 : take N ([]::EE2) [[]] NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_B' = EE2
< Take: case NNS'2. Subgoal 1.16.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : length EE_B' Len NNS'1 : drop N ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N Take1 : take N2 EE2 [] ============================ EE_B' = EE2
< Take: case Take1. Subgoal 1.16.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : length EE_B' Len NNS'1 : drop N ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N ============================ EE_B' = EE2
< compute Take. Subgoal 1.16.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : length EE_B' Len NNS'1 : drop 1 ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ EE_B' = EE2
< apply drop_one to NNS'1. Subgoal 1.16.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE_B') O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE_B') E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : length EE_B' Len NNS'1 : drop 1 ([]::EE_B') EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ EE_B' = EE_B'
< search. Subgoal 1.16.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V ([]::BR) O2 LenEE2 : length ([]::BR) Len NNS' : newNameScopes [[]] Len EE2 BR ============================ []::BR = EE2
< LenBR: case LenEE2. Subgoal 1.16.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V ([]::BR) O2 NNS' : newNameScopes [[]] Len EE2 BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ []::BR = EE2
< apply length_is to LenBR. Subgoal 1.16.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V ([]::BR) O2 NNS' : newNameScopes [[]] Len EE2 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' ============================ []::BR = EE2
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.16.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V ([]::BR) O2 NNS' : newNameScopes [[]] Len EE2 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len ============================ []::BR = EE2
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.16.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V ([]::BR) O2 NNS' : newNameScopes [[]] Len EE2 BR LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len LEq : Len <= N' ============================ []::BR = EE2
< apply less_lesseq_flip_false to L LEq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE_B' O2 LenEE2 : length EE_B' Len NNS' : newNameScopes [[]] Len ([]::EE2) EE_B' Eq : EE_B' = EE2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< clear Ctxs' Ctxs'1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Names2: apply names_exists to _ with L = EE2. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NNS'': assert newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2. Subgoal 1.17: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
< unfold . Subgoal 1.17: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ exists N SNames BNames, ((((length EE2 Len /\ drop N ([(SaveI, V)]::EE2) EE2) /\ take N ([(SaveI, V)]::EE2) [[(SaveI, V)]]) /\ names [[(SaveI, V)]] SNames) /\ names EE2 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveI], N. Subgoal 1.17: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ ((((length EE2 Len /\ drop 1 ([(SaveI, V)]::EE2) EE2) /\ take 1 ([(SaveI, V)]::EE2) [[(SaveI, V)]]) /\ names [[(SaveI, V)]] [SaveI]) /\ names EE2 N) /\ (forall X, mem X [SaveI] -> mem X N -> false)
< split. Subgoal 1.17.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ length EE2 Len
< search. Subgoal 1.17.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ drop 1 ([(SaveI, V)]::EE2) EE2
< search. Subgoal 1.17.3: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ take 1 ([(SaveI, V)]::EE2) [[(SaveI, V)]]
< search. Subgoal 1.17.4: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ names [[(SaveI, V)]] [SaveI]
< search. Subgoal 1.17.5: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ names EE2 N
< search. Subgoal 1.17.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N ============================ forall X, mem X [SaveI] -> mem X N -> false
< intros M MN. Subgoal 1.17.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N M : mem X [SaveI] MN : mem X N ============================ false
< M: case M. Subgoal 1.17.6.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem SaveI N ============================ false
< NS: apply evalExpr_names_same to _ _ _ EvI. Subgoal 1.17.6.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem SaveI N NS : names_same ([]::EE) ([]::EE2) ============================ false
< NS: case NS. Subgoal 1.17.6.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem SaveI N NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ false
< apply names_same_symmetric to NS2. Subgoal 1.17.6.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem SaveI N NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H10 : names_same EE2 EE ============================ false
< apply names_same_names to _ Names2 Names MN. Subgoal 1.17.6.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem SaveI N NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H10 : names_same EE2 EE H11 : mem SaveI Names ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 1.17.6.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N X Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N MN : mem X N M : mem X [] ============================ false
< case M. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvE': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ _ EvE NNS''. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LenEE5: apply evalExpr_keep_scopes to _ _ _ EvE' LenEE2. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NNS+: apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE EvE' NNS''. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5. Subgoal 1.18: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1 ============================ Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5
< NNS+: case NNS+. Subgoal 1.18.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : length EE_B'1 Len NNS+1 : drop N1 (Scope2::EE5) EE_B'1 NNS+2 : take N1 (Scope2::EE5) [[(SaveI, V)]] NNS+3 : names [[(SaveI, V)]] SNames NNS+4 : names EE_B'1 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false ============================ Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5
< Take: case NNS+2. Subgoal 1.18.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : length EE_B'1 Len NNS+1 : drop N1 ([(SaveI, V)]::EE5) EE_B'1 NNS+3 : names [[(SaveI, V)]] SNames NNS+4 : names EE_B'1 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N2 = N1 Take1 : take N2 EE5 [] ============================ [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
< Take: case Take1. Subgoal 1.18.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : length EE_B'1 Len NNS+1 : drop N1 ([(SaveI, V)]::EE5) EE_B'1 NNS+3 : names [[(SaveI, V)]] SNames NNS+4 : names EE_B'1 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
< compute Take. Subgoal 1.18.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : length EE_B'1 Len NNS+1 : drop 1 ([(SaveI, V)]::EE5) EE_B'1 NNS+3 : names [[(SaveI, V)]] SNames NNS+4 : names EE_B'1 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
< apply drop_one to NNS+1. Subgoal 1.18.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 SNames BNames Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE_B'1) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE_B'1) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE_B'1) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : length EE_B'1 Len NNS+1 : drop 1 ([(SaveI, V)]::EE_B'1) EE_B'1 NNS+3 : names [[(SaveI, V)]] SNames NNS+4 : names EE_B'1 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE_B'1
< search. Subgoal 1.18.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1 LenEE5 : length (Scope2::BR) Len NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR ============================ Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
< Len: case LenEE5. Subgoal 1.18.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1 NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR Len : length BR N' Len1 : 1 + N' = Len ============================ Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
< apply length_is to Len. Subgoal 1.18.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1 NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR Len : length BR N' Len1 : 1 + N' = Len H10 : is_integer N' ============================ Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
< L: apply lt_plus_one to Len1 _. Subgoal 1.18.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1 NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR Len : length BR N' Len1 : 1 + N' = Len H10 : is_integer N' L : N' < Len ============================ Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
< LEq: apply newNameScopes_length to NNS+ Len. Subgoal 1.18.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1 NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR Len : length BR N' Len1 : 1 + N' = Len H10 : is_integer N' L : N' < Len LEq : Len <= N' ============================ Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
< apply less_lesseq_flip_false to L LEq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1 EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9) LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE_B'1 O1 LenEE5 : length EE_B'1 Len NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1 Eq : Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert V2 = V. Subgoal 1.19: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ V2 = V
< L: case LI. Subgoal 1.19.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L : lookup [(SaveE, V1), (SaveI, V)] SaveI V2 ============================ V2 = V
< L: case L. Subgoal 1.19.1.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveI Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveI H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V2 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveI, V2), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveI)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V2 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ V2 = V
< apply NEqIE to _. Subgoal 1.19.1.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L : SaveE = SaveI -> false L1 : lookup [(SaveI, V)] SaveI V2 ============================ V2 = V
< L: case L1. Subgoal 1.19.1.2.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V2 ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V2)]::EE2) E V1 ([(SaveI, V2)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V2)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V2 LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V2 EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V2)]] Len ([(SaveI, V2)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V2)]] Len ([(SaveI, V2)]::EE5) EE5 L : SaveE = SaveI -> false ============================ V2 = V2
< search. Subgoal 1.19.1.2.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L : SaveE = SaveI -> false L1 : SaveI = SaveI -> false L2 : lookup [] SaveI V2 ============================ V2 = V
< apply L1 to _. Subgoal 1.19.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L : no_lookup [(SaveE, V1), (SaveI, V)] SaveI L1 : lookupScopes SaveI EE5 V2 ============================ V2 = V
< N: case L. Subgoal 1.19.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L1 : lookupScopes SaveI EE5 V2 N : SaveE = SaveI -> false N1 : no_lookup [(SaveI, V)] SaveI ============================ V2 = V
< N: case N1. Subgoal 1.19.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 L1 : lookupScopes SaveI EE5 V2 N : SaveE = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [] SaveI ============================ V2 = V
< apply N1 to _. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2 EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 Eq : V2 = V ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5. Subgoal 1.20: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
< RS: case EvMI1. Subgoal 1.20.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 LRemain Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::LRemain))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)] RS1 : remove_all [(SaveE, V1), (SaveI, V)] SaveI LRemain ============================ ((SaveI, V)::LRemain)::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
< RA: case RS1. Subgoal 1.20.1.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 LRemain Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveI Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveI H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveI -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveI -> false NEqEL : SaveI = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveI = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveI, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::LRemain))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveI)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveI, V1), (SaveI, V)] RA : remove_all [(SaveI, V)] SaveI LRemain ============================ ((SaveI, V)::LRemain)::EE9 = [(SaveI, V), (SaveI, V1)]::EE9
< apply NEqIE to _. Subgoal 1.20.1.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::R)))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)] RA : SaveE = SaveI -> false RA1 : remove_all [(SaveI, V)] SaveI R ============================ ((SaveI, V)::((SaveE, V1)::R))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
< RA: case RA1. Subgoal 1.20.1.2.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::R)))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)] RA : SaveE = SaveI -> false RA1 : remove_all [] SaveI R ============================ ((SaveI, V)::((SaveE, V1)::R))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
< case RA1. Subgoal 1.20.1.2.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)] RA : SaveE = SaveI -> false ============================ [(SaveI, V), (SaveE, V1)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
< search. Subgoal 1.20.1.2.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::((SaveI, V)::R1))))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE9 O1 LenEE5 : length EE9 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9 RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)] RA : SaveE = SaveI -> false RA1 : SaveI = SaveI -> false RA2 : remove_all [] SaveI R1 ============================ ((SaveI, V)::((SaveE, V1)::((SaveI, V)::R1)))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
< apply RA1 to _. Subgoal 1.20.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 RS : no_lookup [(SaveE, V1), (SaveI, V)] SaveI RS1 : replaceScopes SaveI V EE5 EE9 ============================ [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
< N: case RS. Subgoal 1.20.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 RS1 : replaceScopes SaveI V EE5 EE9 N : SaveE = SaveI -> false N1 : no_lookup [(SaveI, V)] SaveI ============================ [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
< N: case N1. Subgoal 1.20.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 RS1 : replaceScopes SaveI V EE5 EE9 N : SaveE = SaveI -> false N1 : SaveI = SaveI -> false N2 : no_lookup [] SaveI ============================ [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
< apply N1 to _. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 Eq : Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) ([(SaveI, V), (SaveE, V1)]::EE5) LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< clear LI EvMI1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ EvE'. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ EvE'. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< Eq: assert O13 = [] /\ (exists LV, lookupScopes L EE8 LV). Subgoal 1.21: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 ============================ O13 = [] /\ (exists LV, lookupScopes L EE8 LV)
< EvA: case EvA. Subgoal 1.21: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N V4 EE12 FieldVals NewVals Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 EvA : evalExpr FE EE8 (name SaveE) V4 EE12 O13 EvA1 : lookupScopes L EE8 (recVal FieldVals) EvA3 : updateRecFields ["head"] V4 FieldVals NewVals EvA4 : replaceScopes L (recVal NewVals) EE12 EE11 ============================ O13 = [] /\ (exists LV, lookupScopes L EE8 LV)
< case EvA. Subgoal 1.21: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 O14 Len N V4 EE12 FieldVals NewVals Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE12 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : [] ++ O14 = O10 EvNL : evalExpr FE EE12 (null (name L)) falseVal EE12 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 EvA1 : lookupScopes L EE12 (recVal FieldVals) EvA3 : updateRecFields ["head"] V4 FieldVals NewVals EvA4 : replaceScopes L (recVal NewVals) EE12 EE11 H12 : lookupScopes SaveE EE12 V4 ============================ [] = [] /\ (exists LV, lookupScopes L EE12 LV)
< search. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13 EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : O13 ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 Eq : O13 = [] /\ (exists LV, lookupScopes L EE8 LV) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LL: case Eq. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O14 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14 EvA2 : [] ++ O14 = O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case EvA2. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LS: assert exists LV, lookupScopes L EE5 LV. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV ============================ exists LV, lookupScopes L EE5 LV
< NS: apply eval_while_names_same to _ _ _ _ EvW. Subgoal 1.22.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
< search 20. Subgoal 1.22.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV ============================ is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
< search 30. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV NS : names_same ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) EE8 ============================ exists LV, lookupScopes L EE5 LV
< NS: case NS. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest ============================ exists LV, lookupScopes L EE5 LV
< Names5: apply names_exists to _ with L = EE5. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 ============================ exists LV, lookupScopes L EE5 LV
< IsEE8: apply evalStmt_isCtx to _ _ _ EvW. Subgoal 1.22.3: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
< search 20. Subgoal 1.22.4: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 ============================ is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
< search 30. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) ============================ exists LV, lookupScopes L EE5 LV
< Names8: apply names_exists to IsEE8. Subgoal 1.22: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (B::BRest) LV NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 ============================ exists LV, lookupScopes L EE5 LV
< LL: case LL. Subgoal 1.22.5: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ============================ exists LV, lookupScopes L EE5 LV
< ML: apply lookup_mem to LL. Subgoal 1.22.5: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ML : mem (L, LV) B ============================ exists LV, lookupScopes L EE5 LV
< M: apply NS1 to ML. Subgoal 1.22.5: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ML : mem (L, LV) B M : mem (L, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ============================ exists LV, lookupScopes L EE5 LV
< M: case M. Subgoal 1.22.5.1: Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (Hold::Names) SaveI Pr2 : fresh_name "Hold" (Hold::Names) Hold Pr3 : fresh_name "E" (Hold::Names) SaveE Pr4 : fresh_name "C" (Hold::Names) Copy H1 : is_string Hold H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = Hold -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = Hold -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = Hold -> false NEqCH : Copy = Hold -> false NEqCL : Copy = Hold -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems Hold Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate Hold ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name Hold)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B Hold LV ML : mem (Hold, LV) B ============================ exists LV, lookupScopes Hold EE5 LV
< apply NEqHL to _. Subgoal 1.22.5.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ML : mem (L, LV) B M : mem (L, IA) [(SaveI, V), (SaveE, V1)] ============================ exists LV, lookupScopes L EE5 LV
< M: case M. Subgoal 1.22.5.2.1: Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (SaveI::Names) SaveI Pr2 : fresh_name "Hold" (SaveI::Names) Hold Pr3 : fresh_name "E" (SaveI::Names) SaveE Pr4 : fresh_name "C" (SaveI::Names) Copy H1 : is_string SaveI H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveI -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveI -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveI -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems SaveI Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate SaveI ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name SaveI)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B SaveI LV ML : mem (SaveI, LV) B ============================ exists LV, lookupScopes SaveI EE5 LV
< apply NEqIL to _. Subgoal 1.22.5.2.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ML : mem (L, LV) B M : mem (L, IA) [(SaveE, V1)] ============================ exists LV, lookupScopes L EE5 LV
< M: case M. Subgoal 1.22.5.2.2.1: Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (SaveE::Names) SaveI Pr2 : fresh_name "Hold" (SaveE::Names) Hold Pr3 : fresh_name "E" (SaveE::Names) SaveE Pr4 : fresh_name "C" (SaveE::Names) Copy H1 : is_string SaveE H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = SaveE -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = SaveE -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = SaveE -> false NEqCH : Copy = Hold -> false NEqCL : Copy = SaveE -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems SaveE Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate SaveE ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name SaveE)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B SaveE LV ML : mem (SaveE, LV) B ============================ exists LV, lookupScopes SaveE EE5 LV
< apply NEqEL to _. Subgoal 1.22.5.2.2.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : lookup B L LV ML : mem (L, LV) B M : mem (L, IA) [] ============================ exists LV, lookupScopes L EE5 LV
< case M. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) Names8 : names (B::BRest) N2 LL : no_lookup B L LL1 : lookupScopes L BRest LV ============================ exists LV, lookupScopes L EE5 LV
< Names: case Names8. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) LL : no_lookup B L LL1 : lookupScopes L BRest LV Names1 : domain B NScope Names3 : names BRest NRest Names4 : NScope ++ NRest = N2 ============================ exists LV, lookupScopes L EE5 LV
< ML: apply lookupScopes_names to LL1 Names3. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) LL : no_lookup B L LL1 : lookupScopes L BRest LV Names1 : domain B NScope Names3 : names BRest NRest Names4 : NScope ++ NRest = N2 ML : mem L NRest ============================ exists LV, lookupScopes L EE5 LV
< apply names_same_symmetric to NS2. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) LL : no_lookup B L LL1 : lookupScopes L BRest LV Names1 : domain B NScope Names3 : names BRest NRest Names4 : NScope ++ NRest = N2 ML : mem L NRest H12 : names_same BRest EE5 ============================ exists LV, lookupScopes L EE5 LV
< MN1: apply names_same_names to _ Names3 Names5 ML. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) LL : no_lookup B L LL1 : lookupScopes L BRest LV Names1 : domain B NScope Names3 : names BRest NRest Names4 : NScope ++ NRest = N2 ML : mem L NRest H12 : names_same BRest EE5 MN1 : mem L N1 ============================ exists LV, lookupScopes L EE5 LV
< apply names_lookupScopes to _ Names5 MN1. Subgoal 1.22.6: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest V4 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) [] EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 NS : forall X IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] -> exists IB, mem (X, IB) B NS1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] NS2 : names_same EE5 BRest Names5 : names EE5 N1 IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest) LL : no_lookup B L LL1 : lookupScopes L BRest LV Names1 : domain B NScope Names3 : names BRest NRest Names4 : NScope ++ NRest = N2 ML : mem L NRest H12 : names_same BRest EE5 MN1 : mem L N1 H13 : lookupScopes L EE5 V4 ============================ exists LV, lookupScopes L EE5 LV
< search. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : exists LV, lookupScopes L EE5 LV ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LS: case LS. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< ULI: apply proj_eval_listUpdate to NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE _ _ LS EvW EvNL EvA. Subgoal 1.23: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value V LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I V EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
< search 20. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< GEq: apply updateListIndex_pos to ULI. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< LS': assert lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvAgain: apply proj_listUpdate_eval to ULI NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC _ GEq IsFE _ _ LS'. Subgoal 1.24: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
< search 20. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvG: apply drop_proj_rel_evalStmt to EvAgain. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvG: case EvG. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15 EvG1 : evalStmt FE EE12 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O16 EvG2 : O15 ++ O16 = [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvG: case EvG1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16 EE13 O17 O18 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15 EvG2 : O15 ++ O16 = [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17 EvG3 : evalStmt FE EE13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O18 EvG4 : O17 ++ O18 = O16 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< EvG: case EvG3. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16 EE13 O17 O18 EE14 O19 O20 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15 EvG2 : O15 ++ O16 = [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17 EvG4 : O17 ++ O18 = O16 EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19 EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20 EvG6 : O19 ++ O20 = O18 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case EvG2. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 O17 O18 EE14 O19 O20 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17 EvG4 : O17 ++ O18 = [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19 EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20 EvG6 : O19 ++ O20 = O18 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case EvG4. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14 O19 O20 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19 EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20 EvG6 : O19 ++ O20 = [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case EvG6. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalStmt_unique to _ _ _ EvG EvW. Subgoal 1.25: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
< search 20. Subgoal 1.26: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9 EvW1 : O9 ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 [] EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
< search 30. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NS: apply evalStmt_names_same to _ _ _ EvW. Subgoal 1.27: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
< search 20. Subgoal 1.28: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 [] EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L EE8 LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 [] EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] ============================ is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
< search 30. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< IsEE''+: apply evalStmt_isCtx to _ _ _ EvW. Subgoal 1.29: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
< search 20. Subgoal 1.30: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' ============================ is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
< search 30. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalStmt_unique to _ _ _ EvG1 Ev. Subgoal 1.31: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 [] EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ is_stmt (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop)
< search 20. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalStmt_unique to _ _ _ EvG3 EvA. Subgoal 1.32: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE14 Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE14 [] EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ is_stmt (recUpdate L ["head"] (name SaveE))
< search 10. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvG5 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< NS: apply evalStmt_names_same to _ _ _ EvA. Subgoal 1.33: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 [] EvG5 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') ============================ is_stmt (recUpdate L ["head"] (name SaveE))
< search 10. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< IsEE''1+: apply evalStmt_isCtx to _ _ _ EvA. Subgoal 1.34: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 ============================ is_stmt (recUpdate L ["head"] (name SaveE))
< search 10. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply evalStmt_unique to _ _ _ EvG5 EvW2. Subgoal 1.35: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ O10 = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10 EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 G' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ is_stmt (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))
< search 20. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 O1 O4 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ O4 = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvW1 : [] ++ [] = O4 Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< case EvW1. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 O1 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O1 ++ [] = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O1 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev3. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 Ev3 : O3 ++ [] = O3 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< clear Ev3. Subgoal 1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2 EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< FO: case EvAgain3. Subgoal 1.36: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 1.36: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal ============================ evalStmt FE EE (listUpdate L I E) EE' O /\ scopes_same EE' EE'
< split. Subgoal 1.36.1: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal ============================ evalStmt FE EE (listUpdate L I E) EE' O
< search. Subgoal 1.36.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal ============================ scopes_same EE' EE'
< apply lookupScopes_is to _ LS. Subgoal 1.36.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal H12 : is_value LV1 H13 : is_string L ============================ scopes_same EE' EE'
< apply updateListIndex_is to _ _ ULI. Subgoal 1.36.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal H12 : is_value LV1 H13 : is_string L H14 : is_value LV2 ============================ scopes_same EE' EE'
< apply replaceScopes_is to _ _ EvAgain2. Subgoal 1.36.2: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1 Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 LV2 GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" trueVal H12 : is_value LV1 H13 : is_string L H14 : is_value LV2 H15 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 1.37: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Fields' T Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO : lookup [("null", trueVal)] "null" falseVal FO1 : lookup [("null", trueVal)] "tail" T FO2 : replaceRecVal "tail" NewL [("null", trueVal)] Fields' FO3 : flipOnto T (recVal Fields') LV2 ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< L: case FO. Subgoal 1.37: Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Fields' T Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "I" (L::Names) SaveI Pr2 : fresh_name "Hold" (L::Names) Hold Pr3 : fresh_name "E" (L::Names) SaveE Pr4 : fresh_name "C" (L::Names) Copy H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_string SaveI H5 : is_string SaveE H6 : is_string Hold H7 : is_string Copy NEqHI : Hold = SaveI -> false NEqHL : Hold = L -> false NEqIE : SaveI = SaveE -> false NEqIL : SaveI = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false NEqCH : Copy = Hold -> false NEqCL : Copy = L -> false NEqIC : SaveI = Copy -> false NEqEC : SaveE = Copy -> false SN : mems L Ctx' SN1 : exprNames Ctx' I [] SN2 : exprNames Ctx' E [] Ev2 : O2 ++ O3 = O EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2 EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3 EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') [] ENI : exprNames ([]::Ctx') I [] H8 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs'2 : ctx_names EE2 Ctx' H9 : is_value (intVal I1) LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : evalExpr FE EE I (intVal I1) EE2 O2 LenEE2 : length EE2 Len NNS' : newNameScopes [[]] Len ([]::EE2) EE2 Names2 : names EE2 N NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2 EvE' : evalExpr FE EE2 E V1 EE5 O3 LenEE5 : length EE5 Len NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5 H10 : is_value V1 H11 : is_list (is_list (is_pair is_string is_value)) EE5 LL : lookupScopes L (Scope'::EE'') LV LS : lookupScopes L EE5 LV1 ULI : updateListIndex LV1 I1 V1 NewL GEq : I1 >= 0 LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1 EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] EvAgain1 : lookup HFs "null" trueVal EvAgain2 : replaceScopes L LV2 EE5 EE' EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') [] EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') [] EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) [] EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') [] NS : names_same EE5 EE'' IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'') NS1 : names_same EE'' EE''1 IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1) FO1 : lookup [("null", trueVal)] "tail" T FO2 : replaceRecVal "tail" NewL [("null", trueVal)] Fields' FO3 : flipOnto T (recVal Fields') LV2 L : "null" = "null" -> false L1 : lookup [] "null" falseVal ============================ exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
< apply L to _. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O Pr1 : fresh_name "L" (X::Names) SaveL ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< case IsS. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) (Scope::EE') O ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope EE3 O2 O3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O2 Ev1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (listForeach X L Body) [] Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< SN: case SN. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V NL NB Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L NL SN1 : stmtNames ([X]::Ctx') Body NB Ctx2 SN2 : NL ++ NB = [] ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< case SN2. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< EN: apply exprNames_relatedCtxs to _ _ _ _ _ SN with CtxB = []::Ctx'. Subgoal 2.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 ============================ forall X, mems X ([]::Ctx') -> mems X Ctx'
< intros M. Subgoal 2.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 M : mems X1 ([]::Ctx') ============================ mems X1 Ctx'
< M: case M. Subgoal 2.1.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 M : mem X1 [] ============================ mems X1 Ctx'
< case M. Subgoal 2.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 M : mems X1 Ctx' ============================ mems X1 Ctx'
< search. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply ctx_names_add_scope to Ctxs. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ctxs': apply evalExpr_ctx_names to _ _ _ _ _ EN Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx') ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< IsEE2+: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx') IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2) ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< IsEE2: case IsEE2+. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ctxs': case Ctxs'. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Eq: assert Scope1 = []. Subgoal 2.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' ============================ Scope1 = []
< Is: case IsEE2. Subgoal 2.2.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' ============================ [] = []
< search. Subgoal 2.2.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T H Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::(H::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ((H::T)::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) (H::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) (H::T) Ctxs'2 : ctx_names EE2 Ctx' Is : is_pair is_string is_value H Is1 : is_list (is_pair is_string is_value) T ============================ H::T = []
< case Is. Subgoal 2.2.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T B A Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::((A, B)::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (((A, B)::T)::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T) Ctxs'2 : ctx_names EE2 Ctx' Is1 : is_list (is_pair is_string is_value) T H5 : is_string A H6 : is_value B ============================ (A, B)::T = []
< M: apply Ctxs' to _. Subgoal 2.2.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T B A Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::((A, B)::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (((A, B)::T)::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T) Ctxs'2 : ctx_names EE2 Ctx' Is1 : is_list (is_pair is_string is_value) T H5 : is_string A H6 : is_value B M : mem A [] ============================ (A, B)::T = []
< case M. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) Scope1 IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) Scope1 -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1 Ctxs'2 : ctx_names EE2 Ctx' Eq : Scope1 = [] ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Names2: apply names_exists to IsEE1. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply names_is to _ Names2. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Fr: apply fresh_name_exists to _ _ with Base = "L" Names = X::N. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : names_same ([]::EE) ([]::EE2) ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NS: case NS. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply fresh_name_unique_mems to Fr Pr1 _ _. Subgoal 2.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ forall X1, mem X1 (X::Names) -> mem X1 (X::N)
< intros M. Subgoal 2.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 (X::Names) ============================ mem X1 (X::N)
< M: case M. Subgoal 2.3.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ mem X (X::N)
< search. Subgoal 2.3.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 Names ============================ mem X1 (X::N)
< apply names_same_names to NS2 Names Names2 M. Subgoal 2.3.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 Names H7 : mem X1 N ============================ mem X1 (X::N)
< search. Subgoal 2.4: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ forall X1, mem X1 (X::N) -> mem X1 (X::Names)
< intros M. Subgoal 2.4: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 (X::N) ============================ mem X1 (X::Names)
< M: case M. Subgoal 2.4.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ mem X (X::Names)
< search. Subgoal 2.4.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 N ============================ mem X1 (X::Names)
< NS': apply names_same_symmetric to NS2. Subgoal 2.4.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 N NS' : names_same EE2 EE ============================ mem X1 (X::Names)
< apply names_same_names to NS' Names2 Names M. Subgoal 2.4.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) F NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 M : mem X1 N NS' : names_same EE2 EE H7 : mem X1 Names ============================ mem X1 (X::Names)
< search. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply while_to_iterateList to _ _ _ _ _ _ Names2 Fr _ SN1 Ev1. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[]] N1 ([]::EE) EE. Subgoal 2.5: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ newNameScopes [[]] N1 ([]::EE) EE
< unfold . Subgoal 2.5: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ exists N SNames BNames, ((((length EE N1 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], Names. Subgoal 2.5: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ ((((length EE N1 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE Names) /\ (forall X, mem X [] -> mem X Names -> false)
< split. Subgoal 2.5.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ length EE N1
< search. Subgoal 2.5.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ drop 1 ([]::EE) EE
< search. Subgoal 2.5.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ take 1 ([]::EE) [[]]
< search. Subgoal 2.5.4: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ names [[]] []
< search. Subgoal 2.5.5: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ names EE Names
< search. Subgoal 2.5.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 ============================ forall X, mem X [] -> mem X Names -> false
< intros M. Subgoal 2.5.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 M : mem X1 [] H8 : mem X1 Names ============================ false
< case M. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Ev': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ SN Ev NNS. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev' NNS. Subgoal 2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : newNameScopes [[]] N1 ([]::EE2) EE_B' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NNS': case NNS'. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'1 : drop N2 ([]::EE2) EE_B' NNS'2 : take N2 ([]::EE2) [[]] NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Take: case NNS'2. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames N3 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'1 : drop N2 ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N3 = N2 Take1 : take N3 EE2 [] ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< case Take1. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'1 : drop N2 ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N2 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< compute Take. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'1 : drop 1 ([]::EE2) EE_B' NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Drop: case NNS'1. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames N4 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 EE2 EE_B' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply drop_is_integer to Drop1. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames N4 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 EE2 EE_B' H8 : is_integer N4 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE2 EE_B' H8 : is_integer 0 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< Eq: assert EE2 = EE_B'. Subgoal 2.6.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE2 EE_B' H8 : is_integer 0 ============================ EE2 = EE_B'
< D: case Drop1. Subgoal 2.6.1.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 ============================ EE_B' = EE_B'
< search. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L1 EE_B' ============================ X1::L1 = EE_B'
< apply drop_is_integer to D1. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L1 EE_B' H9 : is_integer N5 ============================ X1::L1 = EE_B'
< P: assert 1 + -1 = 0. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + N5 = 0 D1 : drop N5 L1 EE_B' H9 : is_integer N5 P : 1 + -1 = 0 ============================ X1::L1 = EE_B'
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H9 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L1 = EE_B'
< GEq: apply drop_geq_0 to D1. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H9 : is_integer -1 P : 1 + -1 = 0 GEq : -1 >= 0 ============================ X1::L1 = EE_B'
< LEq: case GEq. Subgoal 2.6.1.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1 Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1) Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names (X1::L1) Ctx' H5 : is_value V Names2 : names (X1::L1) N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE (X1::L1) H7 : iterateList FE (X1::L1) V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L1 EE_B' H9 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L1 = EE_B'
< case LEq. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE2 EE_B' H8 : is_integer 0 Eq : EE2 = EE_B' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE_B' EE_B' H8 : is_integer 0 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< clear Take Drop Drop1. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 2.6: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 ============================ evalStmt FE EE (listForeach X L Body) EE' O /\ scopes_same EE' EE'
< split. Subgoal 2.6.2: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 ============================ evalStmt FE EE (listForeach X L Body) EE' O
< search. Subgoal 2.6.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 ============================ scopes_same EE' EE'
< apply fresh_name_is to _ Fr. Subgoal 2.6.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 H9 : is_string SaveL ============================ scopes_same EE' EE'
< IsEE'+: apply evalStmt_isCtx to _ _ _ Ev1. Subgoal 2.6.3.1: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 H9 : is_string SaveL ============================ is_stmt (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))
< search 20. Subgoal 2.6.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 H9 : is_string SaveL IsEE'+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE') ============================ scopes_same EE' EE'
< case IsEE'+. Subgoal 2.6.3: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B' Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE_B' Ctx' H5 : is_value V Names2 : names EE_B' N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE_B' H7 : iterateList FE EE_B' V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V EE_B' O2 NNS' : length EE_B' N1 NNS'3 : names [[]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false H8 : is_integer 0 H9 : is_string SaveL H10 : is_list (is_pair is_string is_value) Scope H11 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< NS': apply evalExpr_names_same to _ _ _ Ev'. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< LenBR+: apply names_same_length to NS' Len. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) LenBR+ : length ([]::BR) N1 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< LenBR: case LenBR+. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) LenBR : length BR N' LenBR1 : 1 + N' = N1 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply length_is to LenBR. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) LenBR : length BR N' LenBR1 : 1 + N' = N1 H8 : is_integer N' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< L: apply lt_plus_one to LenBR1 _. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) LenBR : length BR N' LenBR1 : 1 + N' = N1 H8 : is_integer N' L : N' < N1 ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 2.7: Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N' Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Pr1 : fresh_name "L" (X::Names) SaveL H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2 SN : exprNames Ctx' L [] SN1 : stmtNames ([X]::Ctx') Body [] Ctx2 EN : exprNames ([]::Ctx') L [] H4 : ctx_names ([]::EE) ([]::Ctx') IsEE2 : is_list (is_pair is_string is_value) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : forall K I, mem (K, I) [] -> mem K [] Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) [] Ctxs'2 : ctx_names EE2 Ctx' H5 : is_value V Names2 : names EE2 N H6 : is_list is_string N Fr : fresh_name "L" (X::N) SaveL NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) [] NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) [] NS2 : names_same EE EE2 H7 : iterateList FE EE2 V X Body EE' O3 Len : length EE N1 NNS : newNameScopes [[]] N1 ([]::EE) EE Ev' : evalExpr FE EE L V ([]::BR) O2 NNS' : newNameScopes [[]] N1 EE2 BR NS' : names_same EE ([]::BR) LenBR : length BR N' LenBR1 : 1 + N' = N1 H8 : is_integer N' L : N' < N1 LEq : N1 <= N' ============================ exists EE'', evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
< apply less_lesseq_flip_false to L LEq. Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt with forall FE EE V X Body EE' O, iterateList FE EE V X Body EE' O with IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsV : is_value V, IsX : is_string X, IsBody : is_stmt Body. Subgoal 1.27: Variables: FE EE' Ty IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] 1 @@ Acc : acc 1 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (nil Ty) ============================ <evalExpr {P}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' []
< apply names_exists to IsEE. Subgoal 1.27: Variables: FE EE' Ty N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] 1 @@ Acc : acc 1 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (nil Ty) H1 : names EE' N1 ============================ <evalExpr {P}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' []
< search. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (cons E1 E2) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply names_exists to IsEE. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (cons E1 E2) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (cons E1 E2) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply ext_size_is_int_evalExpr to R4. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (cons E1 E2) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< case IsE. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply plus_integer_is_integer to _ _ R2. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< L: apply lt_plus_one to R1 _. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply ext_size_pos_evalExpr to R3. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply ext_size_pos_evalExpr to R4. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< Acc: case Acc. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< RP1: assert <evalExpr {P}> FE EE E1 V1 EE3 O2. Subgoal 1.28.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< Or: apply lt_left to R2 _ _. Subgoal 1.28.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * Or : N2 < N4 \/ N2 = N4 ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< L': case Or. Subgoal 1.28.1.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< L'': apply less_integer_transitive to L' L. Subgoal 1.28.1.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< A2: apply Acc to _ L''. Subgoal 1.28.1.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< apply IH to R3 A2 _ _ _. Subgoal 1.28.1.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N A2 : acc N2 * H9 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< search. Subgoal 1.28.1.2: Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< A2: apply Acc to _ L. Subgoal 1.28.1.2: Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N4 * ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< apply IH to R3 A2 _ _ _. Subgoal 1.28.1.2: Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N4 * H9 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< search. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< RP2: assert <evalExpr {P}> FE EE3 E2 V2 EE' O3. Subgoal 1.28.2: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< Ev1: apply drop_ext_size_evalExpr to R3. Subgoal 1.28.2: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28.2: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< Or: apply lt_right to R2 _ _ _. Subgoal 1.28.2: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 Or : N3 < N4 \/ N3 = N4 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< L': case Or. Subgoal 1.28.2.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 L' : N3 < N4 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< L'': apply less_integer_transitive to L' L. Subgoal 1.28.2.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 L' : N3 < N4 L'' : N3 < N ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< A3: apply Acc to _ L''. Subgoal 1.28.2.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 L' : N3 < N4 L'' : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< apply IH to R4 A3 _ _ _. Subgoal 1.28.2.1: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 L' : N3 < N4 L'' : N3 < N A3 : acc N3 * H10 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< search. Subgoal 1.28.2.2: Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< A3: apply Acc to _ L. Subgoal 1.28.2.2: Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N4 * ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< apply IH to R4 A3 _ _ _. Subgoal 1.28.2.2: Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 Ev1 : evalExpr FE EE E1 V1 EE3 O2 H9 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N4 * H10 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< search. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< unfold . Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ exists Names E_P V_P EE_P O_P EE1 O1 O2, (<evalExpr {P}> FE EE E1 V1 EE1 O1 /\ (<evalExpr {P}> FE EE1 E2 V2 EE' O2 /\ O1 ++ O2 = O)) /\ (names EE Names /\ (Names |{expr}- cons E1 E2 ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
< exists N1, recBuild (consRecFieldExprs "null" exactEval:host:false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))), recVal [("null", falseVal), ("head", V1), ("tail", V2)], EE', O, EE3, O2, O3. Subgoal 1.28: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ (<evalExpr {P}> FE EE E1 V1 EE3 O2 /\ (<evalExpr {P}> FE EE3 E2 V2 EE' O3 /\ O2 ++ O3 = O)) /\ (names EE N1 /\ (N1 |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) /\ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O))
< split. Subgoal 1.28.3: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE E1 V1 EE3 O2
< search. Subgoal 1.28.4: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE3 E2 V2 EE' O3
< search. Subgoal 1.28.5: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ O2 ++ O3 = O
< search. Subgoal 1.28.6: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ names EE N1
< search. Subgoal 1.28.7: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ N1 |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
< search. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< Ev1: apply drop_ext_size_evalExpr to R3. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< Ev2: apply drop_ext_size_evalExpr to R4. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 H9 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 H9 : is_list (is_list (is_pair is_string is_value)) EE3 IsO2 : is_list is_value O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev2. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 H9 : is_list (is_list (is_pair is_string is_value)) EE3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply is_list_values_append_nil to IsO2. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 H9 : is_list (is_list (is_pair is_string is_value)) EE3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 H10 : O2 ++ [] = O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< apply is_list_values_append_nil to IsO3. Subgoal 1.28.8: Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 ** R5 : O2 ++ O3 = O H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2 RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3 Ev1 : evalExpr FE EE E1 V1 EE3 O2 Ev2 : evalExpr FE EE3 E2 V2 EE' O3 H9 : is_list (is_list (is_pair is_string is_value)) EE3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 H10 : O2 ++ [] = O2 H11 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
< search. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (head E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< apply names_exists to IsEE. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (head E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (head E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (head E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< case IsE. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< Acc: case Acc. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< L: apply lt_plus_one to R1 _. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< A: apply Acc to _ L. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< apply IH to R2 A _ _ _. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< apply is_list_values_append_nil to IsO. Subgoal 1.29: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "head" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O H6 : O ++ [] = O ============================ <evalExpr {P}> FE EE (head E1) V EE' O
< search. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (tail E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< apply names_exists to IsEE. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (tail E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (tail E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (tail E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< case IsE. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< Acc: case Acc. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< L: apply lt_plus_one to R1 _. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< A: apply Acc to _ L. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< apply IH to R2 A _ _ _. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< apply is_list_values_append_nil to IsO. Subgoal 1.30: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "tail" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O H6 : O ++ [] = O ============================ <evalExpr {P}> FE EE (tail E1) V EE' O
< search. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (null E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< apply names_exists to IsEE. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (null E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (null E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (null E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< case IsE. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< Acc: case Acc. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< L: apply lt_plus_one to R1 _. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< A: apply Acc to _ L. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< apply IH to R2 A _ _ _. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< apply is_list_values_append_nil to IsO. Subgoal 1.31: Variables: N FE EE V EE' O N2 Fields E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 ** R3 : lookup Fields "null" V H1 : names EE N1 H2 : is_integer N2 H3 : 0 <= N2 H4 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O Ev : evalExpr FE EE E1 (recVal Fields) EE' O IsO : is_list is_value O H6 : O ++ [] = O ============================ <evalExpr {P}> FE EE (null E1) V EE' O
< search. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (index L I) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< case IsE. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev: apply drop_ext_size_evalExpr to R3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev1: apply drop_ext_size_evalExpr to R4. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsIdx+: apply evalExpr_isValue to _ _ _ Ev1. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 IsIdx+ : is_value (intVal Idx) ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< case IsIdx+. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Len: apply length_exists_list_pair_string_value to IsEE. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE N1 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< rename N1 to LengthEE. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Names: apply names_exists to IsEE. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE. Subgoal 1.32.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ newNameScopes [[]] LengthEE ([]::EE) EE
< unfold . Subgoal 1.32.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ exists N SNames BNames, ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], N1. Subgoal 1.32.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE N1) /\ (forall X, mem X [] -> mem X N1 -> false)
< split. Subgoal 1.32.1.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ length EE LengthEE
< search. Subgoal 1.32.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ drop 1 ([]::EE) EE
< search. Subgoal 1.32.1.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ take 1 ([]::EE) [[]]
< search. Subgoal 1.32.1.4: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ names [[]] []
< search. Subgoal 1.32.1.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ names EE N1
< search. Subgoal 1.32.1.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 ============================ forall X, mem X [] -> mem X N1 -> false
< intros M. Subgoal 1.32.1.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 M : mem X [] H5 : mem X N1 ============================ false
< case M. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_LES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS_L. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_L: apply drop_ext_size_evalExpr to Ev_LES. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS_L. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev Len. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Eq: assert EE_A' = []::EE3. Subgoal 1.32.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE ============================ EE_A' = []::EE3
< NNS': case NNS_L'. Subgoal 1.32.2.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N5 EE_A' EE3 NNS'2 : take N5 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE3
< Take: case NNS'2. Subgoal 1.32.2.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 SNames BNames N6 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N5 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N6 = N5 Take1 : take N6 L1 [] ============================ []::L1 = []::EE3
< case Take1. Subgoal 1.32.2.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop N5 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N5 ============================ []::L1 = []::EE3
< compute Take. Subgoal 1.32.2.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'1 : drop 1 ([]::L1) EE3 NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L1 = []::EE3
< Drop: case NNS'1. Subgoal 1.32.2.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L1 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop1 : drop N7 L1 EE3 ============================ []::L1 = []::EE3
< Drop': case Drop1. Subgoal 1.32.2.1.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ []::EE3 = []::EE3
< search. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop' : 1 + N8 = N7 Drop'1 : drop N8 L2 EE3 ============================ []::(X::L2) = []::EE3
< G: apply drop_geq_0 to Drop'1. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop' : 1 + N8 = N7 Drop'1 : drop N8 L2 EE3 G : N8 >= 0 ============================ []::(X::L2) = []::EE3
< P: assert 1 + -1 = 0. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop' : 1 + N8 = N7 Drop'1 : drop N8 L2 EE3 G : N8 >= 0 P : 1 + -1 = 0 ============================ []::(X::L2) = []::EE3
< apply drop_is_integer to Drop'1. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop' : 1 + N8 = N7 Drop'1 : drop N8 L2 EE3 G : N8 >= 0 P : 1 + -1 = 0 H5 : is_integer N8 ============================ []::(X::L2) = []::EE3
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N7 = 1 Drop' : 1 + N8 = N7 Drop'1 : drop N8 L2 EE3 G : N8 >= 0 P : 1 + -1 = 0 H5 : is_integer N8 H6 : is_integer N7 ============================ []::(X::L2) = []::EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N8 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N8 = 0 Drop'1 : drop N8 L2 EE3 G : N8 >= 0 P : 1 + -1 = 0 H5 : is_integer N8 H6 : is_integer 0 ============================ []::(X::L2) = []::EE3
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L2 EE3 G : -1 >= 0 P : 1 + -1 = 0 H5 : is_integer -1 H6 : is_integer 0 ============================ []::(X::L2) = []::EE3
< L: case G. Subgoal 1.32.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2 LenEE3 : length EE3 LengthEE NNS' : length EE3 LengthEE NNS'3 : names [[]] SNames NNS'4 : names EE3 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L2 EE3 P : 1 + -1 = 0 H5 : is_integer -1 H6 : is_integer 0 L : 0 <= -1 ============================ []::(X::L2) = []::EE3
< case L. Subgoal 1.32.2.2: Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2 LenEE3 : length (S::BR) LengthEE NNS' : newNameScopes [[]] LengthEE AR BR ============================ S::AR = []::(S::BR)
< LenBR: case LenEE3. Subgoal 1.32.2.2: Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ S::AR = []::(S::BR)
< apply length_is to LenBR. Subgoal 1.32.2.2: Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' ============================ S::AR = []::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.32.2.2: Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' LEq : LengthEE <= N' ============================ S::AR = []::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.32.2.2: Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV (S::BR) O2 Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) (S::BR) H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2 NNS' : newNameScopes [[]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H5 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ S::AR = []::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2 Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2 NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3 LenEE3 : length EE3 LengthEE Eq : EE_A' = []::EE3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< case Eq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsNames: apply names_is to _ Names. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< FrL: apply fresh_name_exists to _ IsNames with Base = "L". Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 F ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< FrI: apply fresh_name_exists to _ IsNames with Base = "I". Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 F F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 F FrI : fresh_name "I" N1 F1 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< rename F to SaveL. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 F1 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< rename F1 to SaveI. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_DL: assert <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsEE3: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply fresh_name_is to _ FrL. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply fresh_name_is to _ FrI. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NamesEE3: apply names_exists to IsEE3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NNS_I: assert newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3. Subgoal 1.32.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
< unfold . Subgoal 1.32.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ exists N SNames BNames, ((((length EE3 LengthEE /\ drop N ([(SaveL, LV)]::EE3) EE3) /\ take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] SNames) /\ names EE3 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveL], N5. Subgoal 1.32.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ ((((length EE3 LengthEE /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] [SaveL]) /\ names EE3 N5) /\ (forall X, mem X [SaveL] -> mem X N5 -> false)
< split. Subgoal 1.32.3.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ length EE3 LengthEE
< search. Subgoal 1.32.3.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ drop 1 ([(SaveL, LV)]::EE3) EE3
< search. Subgoal 1.32.3.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
< search. Subgoal 1.32.3.4: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ names [[(SaveL, LV)]] [SaveL]
< search. Subgoal 1.32.3.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ names EE3 N5
< search. Subgoal 1.32.3.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ============================ forall X, mem X [SaveL] -> mem X N5 -> false
< intros ML MN. Subgoal 1.32.3.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 ML : mem X [SaveL] MN : mem X N5 ============================ false
< ML: case ML. Subgoal 1.32.3.6.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 MN : mem SaveL N5 ============================ false
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 1.32.3.6.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 MN : mem SaveL N5 NS : names_same EE EE3 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 1.32.3.6.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 MN : mem SaveL N5 NS : names_same EE EE3 NS' : names_same EE3 EE ============================ false
< MNames: apply names_same_names to _ NamesEE3 Names MN. Subgoal 1.32.3.6.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 MN : mem SaveL N5 NS : names_same EE EE3 NS' : names_same EE3 EE MNames : mem SaveL N1 ============================ false
< apply fresh_name_not_mem to FrL MNames. Subgoal 1.32.3.6.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 MN : mem X N5 ML : mem X [] ============================ false
< case ML. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_IES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS_I. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_I: apply drop_ext_size_evalExpr to Ev_IES. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NNS_If: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_I Ev1 NNS_I. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< LenEE': apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Eq: assert EE_A'1 = [(SaveL, LV)]::EE'. Subgoal 1.32.4: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE ============================ EE_A'1 = [(SaveL, LV)]::EE'
< NNS': case NNS_If. Subgoal 1.32.4.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 N6 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N6 EE_A'1 EE' NNS'2 : take N6 EE_A'1 [[(SaveL, LV)]] NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A'1 = [(SaveL, LV)]::EE'
< Take: case NNS'2. Subgoal 1.32.4.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 N6 SNames BNames N7 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N7 = N6 Take1 : take N7 L1 [] ============================ [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
< case Take1. Subgoal 1.32.4.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 N6 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N6 ============================ [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
< compute Take. Subgoal 1.32.4.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'1 : drop 1 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
< Drop: case NNS'1. Subgoal 1.32.4.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L1 N8 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop1 : drop N8 L1 EE' ============================ [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
< Drop': case Drop1. Subgoal 1.32.4.1.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ [(SaveL, LV)]::EE' = [(SaveL, LV)]::EE'
< search. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop' : 1 + N9 = N8 Drop'1 : drop N9 L2 EE' ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< G: apply drop_geq_0 to Drop'1. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop' : 1 + N9 = N8 Drop'1 : drop N9 L2 EE' G : N9 >= 0 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< P: assert 1 + -1 = 0. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop' : 1 + N9 = N8 Drop'1 : drop N9 L2 EE' G : N9 >= 0 P : 1 + -1 = 0 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< apply drop_is_integer to Drop'1. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop' : 1 + N9 = N8 Drop'1 : drop N9 L2 EE' G : N9 >= 0 P : 1 + -1 = 0 H8 : is_integer N9 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop' : 1 + N9 = N8 Drop'1 : drop N9 L2 EE' G : N9 >= 0 P : 1 + -1 = 0 H8 : is_integer N9 H9 : is_integer N8 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N9 L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N9 = 0 Drop'1 : drop N9 L2 EE' G : N9 >= 0 P : 1 + -1 = 0 H8 : is_integer N9 H9 : is_integer 0 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L2 EE' G : -1 >= 0 P : 1 + -1 = 0 H8 : is_integer -1 H9 : is_integer 0 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< L: case G. Subgoal 1.32.4.1.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L2 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 LenEE' : length EE' LengthEE NNS' : length EE' LengthEE NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L2 EE' P : 1 + -1 = 0 H8 : is_integer -1 H9 : is_integer 0 L : 0 <= -1 ============================ [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
< case L. Subgoal 1.32.4.2: Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 LenEE' : length (S::BR) LengthEE NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR ============================ S::AR = [(SaveL, LV)]::(S::BR)
< LenBR: case LenEE'. Subgoal 1.32.4.2: Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE ============================ S::AR = [(SaveL, LV)]::(S::BR)
< apply length_is to LenBR. Subgoal 1.32.4.2: Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' ============================ S::AR = [(SaveL, LV)]::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.32.4.2: Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' LEq : LengthEE <= N' ============================ S::AR = [(SaveL, LV)]::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.32.4.2: Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR LenBR : length BR N' LenBR1 : 1 + N' = LengthEE H8 : is_integer N' LEq : LengthEE <= N' L : N' < LengthEE ============================ S::AR = [(SaveL, LV)]::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE' LenEE' : length EE' LengthEE Eq : EE_A'1 = [(SaveL, LV)]::EE' ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< case Eq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_DI: assert <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< GEq: apply listIndex_geq_0 to _ R5. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 GEq : Idx >= 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< case GEq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_C: assert <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< EvIf: assert <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< NEq: assert SaveL = SaveI -> false. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 ============================ SaveL = SaveI -> false
< intros E. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 E : SaveL = SaveI ============================ false
< case E. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveI FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 ============================ false
< AppI: apply fresh_name_start to _ FrI. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveI FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 AppI : "I" ++ S = SaveI ============================ false
< AppL: apply fresh_name_start to _ FrL. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5 S S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveI FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveI H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0 AppI : "I" ++ S = SaveI AppL : "L" ++ S1 = SaveI ============================ false
< case AppI. Subgoal 1.32.5: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 S S1 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 ("I"::L3) FrI : fresh_name "I" N1 ("I"::L3) Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy ("I"::L3) L) ([("I"::L3, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string ("I"::L3) H7 : is_string ("I"::L3) NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([("I"::L3, LV)]::EE3) I (intVal Idx) ([("I"::L3, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([("I"::L3, LV)]::EE3) I (intVal Idx) ([("I"::L3, LV)]::EE') O3 NNS_If : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([("I"::L3, LV)]::EE3) (declare intTy ("I"::L3) I) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (greater (num 0) (name ("I"::L3))) falseVal ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] 0 AppL : "L" ++ S1 = "I"::L3 H9 : [] ++ S = L3 ============================ false
< case AppL. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< EvWhile: apply index_to_while to R5 NEq _ with Ctx = EE' FE = FE. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_W: apply drop_ext_size_evalStmt to EvWhile. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< assert SaveI = SaveL -> false. Subgoal 1.32.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ SaveI = SaveL -> false
< intros E. Subgoal 1.32.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] E : SaveI = SaveL ============================ false
< case E. Subgoal 1.32.6: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveL Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveL NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveL I) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveL)) falseVal ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveL -> false EvWhile : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ false
< backchain NEq. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< assert lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields). Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Ev_RFA: assert <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply ext_size_is_int_evalExpr to R4. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply ext_size_pos_evalExpr to R3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply ext_size_pos_evalExpr to R4. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply plus_integer_is_integer to _ _ R2. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< L4: apply lt_plus_one to R1 _. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< Acc: case Acc. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< L2: assert N2 < N. Subgoal 1.32.7: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ N2 < N
< Or: apply lt_left to R2 _ _. Subgoal 1.32.7: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * Or : N2 < N4 \/ N2 = N4 ============================ N2 < N
< C: case Or. Subgoal 1.32.7.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * C : N2 < N4 ============================ N2 < N
< apply less_integer_transitive to C L4. Subgoal 1.32.7.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * C : N2 < N4 H16 : N2 < N ============================ N2 < N
< search. Subgoal 1.32.7.2: Variables: N FE EE V EE' O N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N4 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N4 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N4 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N4 H12 : is_integer N3 H13 : 0 <= N4 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ N4 < N
< search. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< L3: assert N3 < N. Subgoal 1.32.8: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ N3 < N
< Or: apply lt_right to R2 _ _ _. Subgoal 1.32.8: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N Or : N3 < N4 \/ N3 = N4 ============================ N3 < N
< C: case Or. Subgoal 1.32.8.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N C : N3 < N4 ============================ N3 < N
< apply less_integer_transitive to C L4. Subgoal 1.32.8.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N C : N3 < N4 H16 : N3 < N ============================ N3 < N
< search. Subgoal 1.32.8.2: Variables: N FE EE V EE' O N2 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N4 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N4 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N4 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N4 H13 : 0 <= N2 H14 : 0 <= N4 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ N4 < N
< search. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< A2: apply Acc to _ L2. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< A3: apply Acc to _ L3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply ext_size_pos_evalExpr to R. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< GEq4: apply greatereq_integer__add_positive to _ _ _ with N1 = N2 N2 = N3 Base = 0 Sum = N4. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< GEqN: apply greatereq_integer__add_positive to _ _ _ with N1 = 1 N2 = N4 Base = 0 Sum = N. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< OrN: apply greatereq_integer_greater_or_eq to GEqN. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< L0: assert 0 < N. Subgoal 1.32.9: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 ============================ 0 < N
< C: case OrN. Subgoal 1.32.9.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 C : N > 0 ============================ 0 < N
< case C. Subgoal 1.32.9.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 H17 : 0 < N ============================ 0 < N
< search. Subgoal 1.32.9.2: Variables: FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = 0 R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * L2 : N2 < 0 L3 : N3 < 0 A2 : acc N2 * A3 : acc N3 * H16 : 0 <= 0 GEq4 : N4 >= 0 GEqN : 0 >= 0 ============================ 0 < 0
< P: assert 1 + -1 = 0. Subgoal 1.32.9.2: Variables: FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = 0 R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * L2 : N2 < 0 L3 : N3 < 0 A2 : acc N2 * A3 : acc N3 * H16 : 0 <= 0 GEq4 : N4 >= 0 GEqN : 0 >= 0 P : 1 + -1 = 0 ============================ 0 < 0
< apply plus_integer_unique_addend to _ _ _ P R1. Subgoal 1.32.9.2: Variables: FE EE V EE' O N2 N3 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + -1 = 0 R2 : N2 + N3 = -1 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer -1 L4 : -1 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * L2 : N2 < 0 L3 : N3 < 0 A2 : acc N2 * A3 : acc N3 * H16 : 0 <= 0 GEq4 : -1 >= 0 GEqN : 0 >= 0 P : 1 + -1 = 0 ============================ 0 < 0
< L: case GEq4. Subgoal 1.32.9.2: Variables: FE EE V EE' O N2 N3 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + -1 = 0 R2 : N2 + N3 = -1 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer -1 L4 : -1 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * L2 : N2 < 0 L3 : N3 < 0 A2 : acc N2 * A3 : acc N3 * H16 : 0 <= 0 GEqN : 0 >= 0 P : 1 + -1 = 0 L : 0 <= -1 ============================ 0 < 0
< case L. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< A0: apply Acc to _ L0. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH3 to Ev_DL A2 _ _ _. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH3 to Ev_DI A3 _ _ _. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH3 to EvIf A0 _ _ _. Subgoal 1.32.10: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_stmt (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop)
< search 20. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH3 to EvWhile A0 _ _ _. Subgoal 1.32.11: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] ============================ is_stmt (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))
< search 20. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH to R3 A2 _ _ _. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply IH to R4 A3 _ _ _. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< IsO: apply append_values_is to _ _ R6. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< apply is_list_values_append_nil to IsO3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE (index L I) V EE' O
< unfold . Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ exists Names E_P V_P EE_P O_P LV EE1 O1 Idx O2, (<evalExpr {P}> FE EE L LV EE1 O1 /\ (<evalExpr {P}> FE EE1 I (intVal Idx) EE' O2 /\ (listIndex LV Idx V /\ O1 ++ O2 = O))) /\ (names EE Names /\ (Names |{expr}- index L I ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
< exists N1, stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"), V, EE', O, LV, EE3, O2, Idx, O3. Subgoal 1.32: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ (<evalExpr {P}> FE EE L LV EE3 O2 /\ (<evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 /\ (listIndex LV Idx V /\ O2 ++ O3 = O))) /\ (names EE N1 /\ (N1 |{expr}- index L I ~~> stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") /\ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O))
< split. Subgoal 1.32.12: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE L LV EE3 O2
< search. Subgoal 1.32.13: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
< search. Subgoal 1.32.14: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ listIndex LV Idx V
< search. Subgoal 1.32.15: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ O2 ++ O3 = O
< search. Subgoal 1.32.16: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ names EE N1
< search. Subgoal 1.32.17: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ N1 |{expr}- index L I ~~> stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
< search. Subgoal 1.32.18: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
< unfold . Subgoal 1.32.18: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ exists EE1 O1 Scope O2, <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE1 O1 /\ (<evalExpr {P}> FE EE1 (recFieldAccess (name SaveL) "head") V (Scope::EE') O2 /\ O1 ++ O2 = O)
< exists [(SaveI, intVal 0), (SaveL, recVal Fields)]::EE', O, [(SaveI, intVal 0), (SaveL, recVal Fields)], []. Subgoal 1.32.18: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O /\ (<evalExpr {P}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] /\ O ++ [] = O)
< split. Subgoal 1.32.18.1: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O
< search. Subgoal 1.32.18.2: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
< search. Subgoal 1.32.18.3: Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 ** R5 : listIndex LV Idx V R6 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ev : evalExpr FE EE L LV EE3 O2 Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3 H3 : is_list (is_list (is_pair is_string is_value)) EE3 H4 : is_integer Idx Len : length EE LengthEE Names : names EE N1 NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3 LenEE3 : length EE3 LengthEE IsNames : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrI : fresh_name "I" N1 SaveI Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value LV H6 : is_string SaveL H7 : is_string SaveI NamesEE3 : names EE3 N5 NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3 Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3 Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE' LenEE' : length EE' LengthEE Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3 H8 : 0 <= Idx Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0 NEq : SaveL = SaveI -> false EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 EvWhile1 : lookup Fields "head" V Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H9 : SaveI = SaveL -> false H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields) Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0 H11 : is_integer N2 H12 : is_integer N3 H13 : 0 <= N2 H14 : 0 <= N3 H15 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H16 : 0 <= N GEq4 : N4 >= 0 GEqN : N >= 0 OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 H19 : is_list (is_list (is_pair is_string is_value)) EE' H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] H22 : <evalExpr {P}> FE EE L LV EE3 O2 H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 IsO : is_list is_value O H24 : O3 ++ [] = O3 ============================ O ++ [] = O
< backchain is_list_values_append_nil. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (exactEval:list:length E1) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< case IsE. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Names: apply names_exists to IsEE. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< IsN1: apply names_is to _ Names. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< FrL: apply fresh_name_exists to _ IsN1 with Base = "L". Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 F ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< FrLen: apply fresh_name_exists to _ IsN1 with Base = "Len". Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 F F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 F FrLen : fresh_name "Len" N1 F1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< rename F to SaveL. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 F1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< rename F1 to Len. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< NEq: assert SaveL = Len -> false. Subgoal 1.33.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len ============================ SaveL = Len -> false
< intros E. Subgoal 1.33.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len E : SaveL = Len ============================ false
< case E. Subgoal 1.33.1: Variables: N FE EE EE' O N2 V1 I E1 N1 Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 Len FrLen : fresh_name "Len" N1 Len ============================ false
< AppLen: apply fresh_name_start to _ FrLen. Subgoal 1.33.1: Variables: N FE EE EE' O N2 V1 I E1 N1 Len S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 Len FrLen : fresh_name "Len" N1 Len AppLen : "Len" ++ S = Len ============================ false
< FrL: case FrL. Subgoal 1.33.1.1: Variables: N FE EE EE' O N2 V1 I E1 N1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 "L" AppLen : "Len" ++ S = "L" FrL : not_mem "L" N1 ============================ false
< App: case AppLen. Subgoal 1.33.1.1: Variables: N FE EE EE' O N2 V1 I E1 N1 S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 "L" FrL : not_mem "L" N1 App : "en" ++ S = [] ============================ false
< case App. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 Len S NewBase IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 Len AppLen : "Len" ++ S = Len FrL : mem "L" N1 FrL1 : "L" ++ "_" = NewBase FrL2 : fresh_name NewBase N1 Len ============================ false
< AppL: case FrL1. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 Len S L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 Len AppLen : "Len" ++ S = Len FrL : mem "L" N1 FrL2 : fresh_name ("L"::L3) N1 Len AppL : [] ++ "_" = L3 ============================ false
< case AppL. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 Len S IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 Len AppLen : "Len" ++ S = Len FrL : mem "L" N1 FrL2 : fresh_name "L_" N1 Len ============================ false
< AppL: apply fresh_name_start to _ FrL2. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 Len S S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 Len AppLen : "Len" ++ S = Len FrL : mem "L" N1 FrL2 : fresh_name "L_" N1 Len AppL : "L_" ++ S1 = Len ============================ false
< AppL: case AppL. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 ("L"::L1) AppLen : "Len" ++ S = "L"::L1 FrL : mem "L" N1 FrL2 : fresh_name "L_" N1 ("L"::L1) AppL : "_" ++ S1 = L1 ============================ false
< case AppL. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 ("L"::("_"::L4)) AppLen : "Len" ++ S = "L"::("_"::L4) FrL : mem "L" N1 FrL2 : fresh_name "L_" N1 ("L"::("_"::L4)) H2 : [] ++ S1 = L4 ============================ false
< AppLen: case AppLen. Subgoal 1.33.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrLen : fresh_name "Len" N1 ("L"::("_"::L4)) FrL : mem "L" N1 FrL2 : fresh_name "L_" N1 ("L"::("_"::L4)) H2 : [] ++ S1 = L4 AppLen : "en" ++ S = "_"::L4 ============================ false
< case AppLen. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< NNS: assert newNameScopes [[]] N3 ([]::EE) EE. Subgoal 1.33.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ newNameScopes [[]] N3 ([]::EE) EE
< unfold . Subgoal 1.33.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ exists N SNames BNames, ((((length EE N3 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], N1. Subgoal 1.33.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ ((((length EE N3 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE N1) /\ (forall X, mem X [] -> mem X N1 -> false)
< split. Subgoal 1.33.2.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ length EE N3
< search. Subgoal 1.33.2.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ drop 1 ([]::EE) EE
< search. Subgoal 1.33.2.3: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ take 1 ([]::EE) [[]]
< search. Subgoal 1.33.2.4: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ names [[]] []
< search. Subgoal 1.33.2.5: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ names EE N1
< search. Subgoal 1.33.2.6: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 ============================ forall X, mem X [] -> mem X N1 -> false
< intros M. Subgoal 1.33.2.6: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 M : mem X [] H2 : mem X N1 ============================ false
< case M. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_L_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R2 NNS. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_L: apply drop_ext_size_evalExpr to Ev_L_ES. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< NNS_L: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N3 EE_A' EE' ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< LenEE': apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N3 EE_A' EE' LenEE' : length EE' N3 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Eq: assert EE_A' = []::EE'. Subgoal 1.33.3: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N3 EE_A' EE' LenEE' : length EE' N3 ============================ EE_A' = []::EE'
< NNS': case NNS_L. Subgoal 1.33.3.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' N4 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'1 : drop N4 EE_A' EE' NNS'2 : take N4 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE'
< Take: case NNS'2. Subgoal 1.33.3.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 N4 SNames BNames N5 L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'1 : drop N4 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N5 = N4 Take1 : take N5 L [] ============================ []::L = []::EE'
< case Take1. Subgoal 1.33.3.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 N4 SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'1 : drop N4 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N4 ============================ []::L = []::EE'
< compute Take. Subgoal 1.33.3.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'1 : drop 1 ([]::L) EE' NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L = []::EE'
< Drop: case NNS'1. Subgoal 1.33.3.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 L EE' ============================ []::L = []::EE'
< Drop': case Drop1. Subgoal 1.33.3.1.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 ============================ []::EE' = []::EE'
< search. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L1 EE' ============================ []::(X::L1) = []::EE'
< G: apply drop_geq_0 to Drop'1. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L1 EE' G : N7 >= 0 ============================ []::(X::L1) = []::EE'
< P: assert 1 + -1 = 0. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L1 EE' G : N7 >= 0 P : 1 + -1 = 0 ============================ []::(X::L1) = []::EE'
< apply drop_is_integer to Drop'1. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L1 EE' G : N7 >= 0 P : 1 + -1 = 0 H2 : is_integer N7 ============================ []::(X::L1) = []::EE'
< apply plus_integer_is_integer to _ _ Drop'. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop' : 1 + N7 = N6 Drop'1 : drop N7 L1 EE' G : N7 >= 0 P : 1 + -1 = 0 H2 : is_integer N7 H3 : is_integer N6 ============================ []::(X::L1) = []::EE'
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N7 L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + N7 = 0 Drop'1 : drop N7 L1 EE' G : N7 >= 0 P : 1 + -1 = 0 H2 : is_integer N7 H3 : is_integer 0 ============================ []::(X::L1) = []::EE'
< apply plus_integer_unique_addend to _ _ _ Drop' P. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' G : -1 >= 0 P : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 ============================ []::(X::L1) = []::EE'
< L: case G. Subgoal 1.33.3.1.2: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L1 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O LenEE' : length EE' N3 NNS' : length EE' N3 NNS'3 : names [[]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE' P : 1 + -1 = 0 H2 : is_integer -1 H3 : is_integer 0 L : 0 <= -1 ============================ []::(X::L1) = []::EE'
< case L. Subgoal 1.33.3.2: Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O LenEE' : length (S::BR) N3 NNS' : newNameScopes [[]] N3 AR BR ============================ S::AR = []::(S::BR)
< LenBR: case LenEE'. Subgoal 1.33.3.2: Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N3 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N3 ============================ S::AR = []::(S::BR)
< apply length_is to LenBR. Subgoal 1.33.3.2: Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N3 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N3 H2 : is_integer N' ============================ S::AR = []::(S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 1.33.3.2: Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N3 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N3 H2 : is_integer N' LEq : N3 <= N' ============================ S::AR = []::(S::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 1.33.3.2: Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 (S::BR) O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O NNS' : newNameScopes [[]] N3 AR BR LenBR : length BR N' LenBR1 : 1 + N' = N3 H2 : is_integer N' LEq : N3 <= N' L : N' < N3 ============================ S::AR = []::(S::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O NNS_L : newNameScopes [[]] N3 EE_A' EE' LenEE' : length EE' N3 Eq : EE_A' = []::EE' ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< case Eq. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_DL: assert <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_DLen: assert <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply listLength_is to _ R3. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< P: assert 0 + I = I. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< P': apply plus_integer_comm to _ _ P. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_W_ES: apply length_to_while to R3 NEq P' _ _ with FE = FE Ctx = EE'. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_W: apply drop_ext_size_evalStmt to Ev_W_ES. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< LS: assert lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I). Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Ev_N: assert <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< P2: apply ext_size_pos_evalExpr to R2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< L2: apply lt_plus_one to R1 _. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< Acc: case Acc. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< A2: apply Acc to _ L2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< LEqN: apply ext_size_pos_evalExpr to R. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< OrN: apply greatereq_integer_greater_or_eq to _ with A = N B = 0. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< L0: assert 0 < N. Subgoal 1.33.4: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 ============================ 0 < N
< C: case OrN. Subgoal 1.33.4.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N C : N > 0 ============================ 0 < N
< case C. Subgoal 1.33.4.1: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N H5 : 0 < N ============================ 0 < N
< search. Subgoal 1.33.4.2: Variables: FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = 0 R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * A2 : acc N2 * LEqN : 0 <= 0 ============================ 0 < 0
< P'': assert 1 + -1 = 0. Subgoal 1.33.4.2: Variables: FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = 0 R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * A2 : acc N2 * LEqN : 0 <= 0 P'' : 1 + -1 = 0 ============================ 0 < 0
< apply plus_integer_unique_addend to _ _ _ P'' R1. Subgoal 1.33.4.2: Variables: FE EE EE' O V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + -1 = 0 R2 : <evalExpr {ES}> FE EE E1 V1 EE' O -1 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O -1 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O -1 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer -1 P2 : 0 <= -1 L2 : -1 < 0 Acc : forall M, 0 <= M -> M < 0 -> acc M * A2 : acc -1 * LEqN : 0 <= 0 P'' : 1 + -1 = 0 ============================ 0 < 0
< L: case P2. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< A0: apply Acc to _ L0. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply fresh_name_is to _ FrL. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply fresh_name_is to _ FrLen. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply IH to R2 A2 _ _ _. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply IH3 to Ev_DL A2 _ _ _. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply IH3 to Ev_DLen A0 _ _ _. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply IH3 to Ev_W_ES A0 _ _ _. Subgoal 1.33.5: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] ============================ is_stmt (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))
< search 20. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply evalStmt_isCtx to _ _ _ Ev_W. Subgoal 1.33.6: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ is_stmt (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))
< search 20. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< apply IH to Ev_N A0 _ _ _. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
< unfold . Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ exists Names E_P V_P EE_P O_P V, (<evalExpr {P}> FE EE E1 V EE' O /\ listLength V I) /\ (names EE Names /\ (Names |{expr}- exactEval:list:length E1 ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
< exists N1, stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len), intVal I, EE', O, V1. Subgoal 1.33: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ (<evalExpr {P}> FE EE E1 V1 EE' O /\ listLength V1 I) /\ (names EE N1 /\ (N1 |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) /\ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O))
< split. Subgoal 1.33.7: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE E1 V1 EE' O
< search. Subgoal 1.33.8: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ listLength V1 I
< search. Subgoal 1.33.9: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ names EE N1
< search. Subgoal 1.33.10: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ N1 |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
< search. Subgoal 1.33.11: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.33.11: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
< apply is_list_values_append_nil to IsO. Subgoal 1.33.11: Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 ** R3 : listLength V1 I H1 : is_expr E1 Ev : evalExpr FE EE E1 V1 EE' O Names : names EE N1 IsN1 : is_list is_string N1 FrL : fresh_name "L" N1 SaveL FrLen : fresh_name "Len" N1 Len NEq : SaveL = Len -> false LenEE : length EE N3 NNS : newNameScopes [[]] N3 ([]::EE) EE Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2 Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O NNS_L : newNameScopes [[]] N3 ([]::EE') EE' LenEE' : length EE' N3 Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2 Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0 H2 : is_value V1 H3 : is_integer I P : 0 + I = I P' : I + 0 = I Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 Ev_W_ES1 : lookup Fields "null" trueVal Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I) Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0 H4 : is_integer N2 P2 : 0 <= N2 L2 : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * LEqN : 0 <= N OrN : N > 0 \/ N = 0 L0 : 0 < N A0 : acc 0 * H5 : is_string SaveL H6 : is_string Len H7 : <evalExpr {P}> FE EE E1 V1 EE' O H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O H9 : is_list (is_list (is_pair is_string is_value)) EE' H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] IsO : is_list is_value O H14 : O ++ [] = O ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (listUpdate L I E) R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Is: case IsS. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Ev: apply drop_ext_size_evalExpr to R3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Ev1: apply drop_ext_size_evalExpr to R4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply ext_size_is_int_evalExpr to R4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply plus_integer_is_integer to _ _ R2. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< L4: apply lt_plus_one to R1 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Acc: case Acc. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply ext_size_pos_evalExpr to R3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply ext_size_pos_evalExpr to R4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< L2: assert N2 < N. Subgoal 4.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 ============================ N2 < N
< Or: apply lt_right to R2 _ _ _. Subgoal 4.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 Or : N2 < N4 \/ N2 = N4 ============================ N2 < N
< L': case Or. Subgoal 4.15.1.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L' : N2 < N4 ============================ N2 < N
< L'': apply less_integer_transitive to L' L4. Subgoal 4.15.1.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L' : N2 < N4 L'' : N2 < N ============================ N2 < N
< search. Subgoal 4.15.1.2: Variables: N FE EE EE' O N3 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N4 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N4 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N4 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N4 ============================ N4 < N
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< L3: assert N3 < N. Subgoal 4.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N ============================ N3 < N
< Or: apply lt_left to R2 _ _. Subgoal 4.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N Or : N3 < N4 \/ N3 = N4 ============================ N3 < N
< L': case Or. Subgoal 4.15.2.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L' : N3 < N4 ============================ N3 < N
< L'': apply less_integer_transitive to L' L4. Subgoal 4.15.2.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L' : N3 < N4 L'' : N3 < N ============================ N3 < N
< search. Subgoal 4.15.2.2: Variables: N FE EE EE' O N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N4 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N4 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N4 H5 : 0 <= N2 L2 : N2 < N ============================ N4 < N
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< A2: apply Acc to _ L2. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< A3: apply Acc to _ L3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply IH to R3 A3 _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply IH to R4 A2 _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Names: apply names_exists to IsEE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsNames: apply names_is to _ Names. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Is+: assert is_list is_string (L::N5). Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Pr3: apply fresh_name_exists to _ Is+ with Base = "E". Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) F ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Pr1: apply fresh_name_exists to _ Is+ with Base = "I". Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) F Pr1 : fresh_name "I" (L::N5) F1 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Pr2: apply fresh_name_exists to _ Is+ with Base = "Hold". Subgoal 4.15.3: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) F Pr1 : fresh_name "I" (L::N5) F1 ============================ is_string "Hold"
< search 6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 F2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) F Pr1 : fresh_name "I" (L::N5) F1 Pr2 : fresh_name "Hold" (L::N5) F2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Pr3: apply fresh_name_exists to _ Is+ with Base = "C". Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 F2 F3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) F Pr1 : fresh_name "I" (L::N5) F1 Pr2 : fresh_name "Hold" (L::N5) F2 Pr4 : fresh_name "C" (L::N5) F3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< rename F to SaveE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE F1 F2 F3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) F1 Pr2 : fresh_name "Hold" (L::N5) F2 Pr4 : fresh_name "C" (L::N5) F3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< rename F1 to SaveI. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI F2 F3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) F2 Pr4 : fresh_name "C" (L::N5) F3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< rename F2 to Hold. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold F3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) F3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< rename F3 to Copy. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert SaveE = L -> false. Subgoal 4.15.4: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy ============================ SaveE = L -> false
< intros E. Subgoal 4.15.4: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy E : SaveE = L ============================ false
< case E. Subgoal 4.15.4: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) L Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy ============================ false
< apply fresh_name_not_mem to Pr3 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert SaveI = L -> false. Subgoal 4.15.5: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false ============================ SaveI = L -> false
< intros E. Subgoal 4.15.5: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false E : SaveI = L ============================ false
< case E. Subgoal 4.15.5: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) L Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert Hold = L -> false. Subgoal 4.15.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false ============================ Hold = L -> false
< intros E. Subgoal 4.15.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false E : Hold = L ============================ false
< case E. Subgoal 4.15.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) L Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false ============================ false
< apply fresh_name_not_mem to Pr2 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert Copy = L -> false. Subgoal 4.15.7: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false ============================ Copy = L -> false
< intros E. Subgoal 4.15.7: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false E : Copy = L ============================ false
< case E. Subgoal 4.15.7: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) L H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false ============================ false
< apply fresh_name_not_mem to Pr4 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert Hold = SaveE -> false. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false ============================ Hold = SaveE -> false
< intros E. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false E : Hold = SaveE ============================ false
< case E. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveE Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveE = L -> false H12 : Copy = L -> false ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveE Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveE = L -> false H12 : Copy = L -> false AppE : "E" ++ S1 = SaveE ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 4.15.8.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveE Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveE = L -> false H12 : Copy = L -> false AppE : "E" ++ S1 = SaveE ============================ is_string "Hold"
< search 6. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveE Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveE = L -> false H12 : Copy = L -> false AppE : "E" ++ S1 = SaveE AppH : "Hold" ++ S2 = SaveE ============================ false
< case AppE. Subgoal 4.15.8: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Copy S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) ("E"::L3) Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) ("E"::L3) Pr4 : fresh_name "C" (L::N5) Copy H9 : "E"::L3 = L -> false H10 : SaveI = L -> false H11 : "E"::L3 = L -> false H12 : Copy = L -> false AppH : "Hold" ++ S2 = "E"::L3 H13 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert Hold = SaveI -> false. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false ============================ Hold = SaveI -> false
< intros E. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false E : Hold = SaveI ============================ false
< case E. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveI Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveI = L -> false H12 : Copy = L -> false H13 : SaveI = SaveE -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveI Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveI = L -> false H12 : Copy = L -> false H13 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 4.15.9.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveI Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveI = L -> false H12 : Copy = L -> false H13 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI ============================ is_string "Hold"
< search 6. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) SaveI Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : SaveI = L -> false H12 : Copy = L -> false H13 : SaveI = SaveE -> false AppI : "I" ++ S1 = SaveI AppH : "Hold" ++ S2 = SaveI ============================ false
< case AppI. Subgoal 4.15.9: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Copy S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) ("I"::L3) Pr2 : fresh_name "Hold" (L::N5) ("I"::L3) Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : "I"::L3 = L -> false H11 : "I"::L3 = L -> false H12 : Copy = L -> false H13 : "I"::L3 = SaveE -> false AppH : "Hold" ++ S2 = "I"::L3 H14 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NEqIE: assert SaveI = SaveE -> false. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false ============================ SaveI = SaveE -> false
< intros E. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false E : SaveI = SaveE ============================ false
< case E. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveE Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveE = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveE -> false ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveE Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveE = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveE -> false AppI : "I" ++ S1 = SaveE ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveE Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveE = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveE -> false AppI : "I" ++ S1 = SaveE AppE : "E" ++ S2 = SaveE ============================ false
< case AppI. Subgoal 4.15.10: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 Hold Copy S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) ("I"::L3) Pr1 : fresh_name "I" (L::N5) ("I"::L3) Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : "I"::L3 = L -> false H10 : "I"::L3 = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = "I"::L3 -> false H14 : Hold = "I"::L3 -> false AppE : "E" ++ S2 = "I"::L3 H15 : [] ++ S1 = L3 ============================ false
< case AppE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert Copy = Hold -> false. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ Copy = Hold -> false
< intros E. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false E : Copy = Hold ============================ false
< case E. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Hold H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Hold = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Hold H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Hold = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold ============================ false
< AppH: apply fresh_name_start to _ Pr2. Subgoal 4.15.11.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Hold H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Hold = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold ============================ is_string "Hold"
< search 6. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Hold H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Hold = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false AppC : "C" ++ S1 = Hold AppH : "Hold" ++ S2 = Hold ============================ false
< case AppC. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) ("C"::L3) Pr4 : fresh_name "C" (L::N5) ("C"::L3) H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : "C"::L3 = L -> false H12 : "C"::L3 = L -> false H13 : "C"::L3 = SaveE -> false H14 : "C"::L3 = SaveI -> false NEqIE : SaveI = SaveE -> false AppH : "Hold" ++ S2 = "C"::L3 H15 : [] ++ S1 = L3 ============================ false
< case AppH. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert SaveE = Copy -> false. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false ============================ SaveE = Copy -> false
< intros E. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false E : SaveE = Copy ============================ false
< case E. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) Copy Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : Copy = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = Copy -> false H14 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H15 : Copy = Hold -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) Copy Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : Copy = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = Copy -> false H14 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H15 : Copy = Hold -> false AppC : "C" ++ S1 = Copy ============================ false
< AppE: apply fresh_name_start to _ Pr3. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) Copy Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : Copy = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = Copy -> false H14 : Hold = SaveI -> false NEqIE : SaveI = Copy -> false H15 : Copy = Hold -> false AppC : "C" ++ S1 = Copy AppE : "E" ++ S2 = Copy ============================ false
< case AppC. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) ("C"::L3) Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) ("C"::L3) H9 : "C"::L3 = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : "C"::L3 = L -> false H13 : Hold = "C"::L3 -> false H14 : Hold = SaveI -> false NEqIE : SaveI = "C"::L3 -> false H15 : "C"::L3 = Hold -> false AppE : "E" ++ S2 = "C"::L3 H16 : [] ++ S1 = L3 ============================ false
< case AppE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< assert SaveI = Copy -> false. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false ============================ SaveI = Copy -> false
< intros E. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false E : SaveI = Copy ============================ false
< case E. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) Copy Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : Copy = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false ============================ false
< AppC: apply fresh_name_start to _ Pr4. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) Copy Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : Copy = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false AppC : "C" ++ S1 = Copy ============================ false
< AppI: apply fresh_name_start to _ Pr1. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 S2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) Copy Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : Copy = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = Copy -> false NEqIE : Copy = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false AppC : "C" ++ S1 = Copy AppI : "I" ++ S2 = Copy ============================ false
< case AppC. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold S1 S2 L3 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) ("C"::L3) Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) ("C"::L3) H9 : SaveE = L -> false H10 : "C"::L3 = L -> false H11 : Hold = L -> false H12 : "C"::L3 = L -> false H13 : Hold = SaveE -> false H14 : Hold = "C"::L3 -> false NEqIE : "C"::L3 = SaveE -> false H15 : "C"::L3 = Hold -> false H16 : SaveE = "C"::L3 -> false AppI : "I" ++ S2 = "C"::L3 H17 : [] ++ S1 = L3 ============================ false
< case AppI. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE N6 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< rename N6 to Len. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NNS: assert newNameScopes [[]] Len ([]::EE) EE. Subgoal 4.15.14: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ newNameScopes [[]] Len ([]::EE) EE
< unfold . Subgoal 4.15.14: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], N5. Subgoal 4.15.14: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE N5) /\ (forall X, mem X [] -> mem X N5 -> false)
< split. Subgoal 4.15.14.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ length EE Len
< search. Subgoal 4.15.14.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ drop 1 ([]::EE) EE
< search. Subgoal 4.15.14.3: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ take 1 ([]::EE) [[]]
< search. Subgoal 4.15.14.4: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ names [[]] []
< search. Subgoal 4.15.14.5: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ names EE N5
< search. Subgoal 4.15.14.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len ============================ forall X, mem X [] -> mem X N5 -> false
< intros M. Subgoal 4.15.14.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len M : mem X [] H18 : mem X N5 ============================ false
< case M. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvI': apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvI'': apply drop_ext_size_evalExpr to EvI'. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI'' Ev _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Eq: assert EE_A' = []::EE2. Subgoal 4.15.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 ============================ EE_A' = []::EE2
< NNS': case NNS'. Subgoal 4.15.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' N6 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2 NNS' : length EE2 Len NNS'1 : drop N6 EE_A' EE2 NNS'2 : take N6 EE_A' [[]] NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = []::EE2
< Take: case NNS'2. Subgoal 4.15.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames N7 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop N6 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N7 = N6 Take1 : take N7 L1 [] ============================ []::L1 = []::EE2
< case Take1. Subgoal 4.15.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop N6 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N6 ============================ []::L1 = []::EE2
< compute Take. Subgoal 4.15.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2 NNS' : length EE2 Len NNS'1 : drop 1 ([]::L1) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::L1 = []::EE2
< apply drop_one to NNS'1. Subgoal 4.15.15.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : length EE2 Len NNS'1 : drop 1 ([]::EE2) EE2 NNS'3 : names [[]] SNames NNS'4 : names EE2 BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ []::EE2 = []::EE2
< search. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR ============================ S1::AR = []::(S1::BR)
< LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR+ : length (S1::BR) Len ============================ S1::AR = []::(S1::BR)
< LenBR: case LenBR+. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ S1::AR = []::(S1::BR)
< apply length_is to LenBR. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H18 : is_integer N' ============================ S1::AR = []::(S1::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H18 : is_integer N' L : N' < Len ============================ S1::AR = []::(S1::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 4.15.15.2: Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 ** R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2 Ev1 : evalExpr FE (S1::BR) E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR) H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2 H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2 NNS' : newNameScopes [[]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H18 : is_integer N' L : N' < Len LEq : Len <= N' ============================ S1::AR = []::(S1::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2 NNS' : newNameScopes [[]] Len EE_A' EE2 Eq : EE_A' = []::EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< case Eq. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply IH to EvI' A3 _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvAI: assert <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply fresh_name_is to _ Pr1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsEE2: apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Names2: apply names_exists to IsEE2. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NS: apply evalExpr_names_same to _ _ _ Ev. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Len2: apply evalExpr_keep_scopes to _ _ _ Ev LenEE. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NNS+: assert newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2. Subgoal 4.15.16: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
< unfold . Subgoal 4.15.16: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ exists N SNames BNames, ((((length EE2 Len /\ drop N ([(SaveI, intVal N1)]::EE2) EE2) /\ take N ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]) /\ names [[(SaveI, intVal N1)]] SNames) /\ names EE2 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveI], N6. Subgoal 4.15.16: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ ((((length EE2 Len /\ drop 1 ([(SaveI, intVal N1)]::EE2) EE2) /\ take 1 ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]) /\ names [[(SaveI, intVal N1)]] [SaveI]) /\ names EE2 N6) /\ (forall X, mem X [SaveI] -> mem X N6 -> false)
< split. Subgoal 4.15.16.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ length EE2 Len
< search. Subgoal 4.15.16.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ drop 1 ([(SaveI, intVal N1)]::EE2) EE2
< search. Subgoal 4.15.16.3: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ take 1 ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]
< search. Subgoal 4.15.16.4: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ names [[(SaveI, intVal N1)]] [SaveI]
< search. Subgoal 4.15.16.5: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ names EE2 N6
< search. Subgoal 4.15.16.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len ============================ forall X, mem X [SaveI] -> mem X N6 -> false
< intros M MX. Subgoal 4.15.16.6: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len M : mem X [SaveI] MX : mem X N6 ============================ false
< M: case M. Subgoal 4.15.16.6.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N6 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 4.15.16.6.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N6 NS' : names_same EE2 EE ============================ false
< M': apply names_same_names to NS' Names2 Names MX. Subgoal 4.15.16.6.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem SaveI N6 NS' : names_same EE2 EE M' : mem SaveI N5 ============================ false
< apply fresh_name_not_mem to Pr1 _. Subgoal 4.15.16.6.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len MX : mem X N6 M : mem X [] ============================ false
< case M. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvE': apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS+. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvE'': apply drop_ext_size_evalExpr to EvE'. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE'' Ev1 _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Len4: apply evalExpr_keep_scopes to _ _ _ Ev1 Len2. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4 Len4 : length EE4 Len ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Eq: assert EE_A'1 = [(SaveI, intVal N1)]::EE4. Subgoal 4.15.17: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4 Len4 : length EE4 Len ============================ EE_A'1 = [(SaveI, intVal N1)]::EE4
< NN: case NNS''. Subgoal 4.15.17.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 N7 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N7 EE_A'1 EE4 NN2 : take N7 EE_A'1 [[(SaveI, intVal N1)]] NN3 : names [[(SaveI, intVal N1)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A'1 = [(SaveI, intVal N1)]::EE4
< Take: case NN2. Subgoal 4.15.17.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 SNames BNames N8 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N7 ([(SaveI, intVal N1)]::L1) EE4 NN3 : names [[(SaveI, intVal N1)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N8 = N7 Take1 : take N8 L1 [] ============================ [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
< Take: case Take1. Subgoal 4.15.17.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop N7 ([(SaveI, intVal N1)]::L1) EE4 NN3 : names [[(SaveI, intVal N1)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N7 ============================ [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
< compute Take. Subgoal 4.15.17.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop 1 ([(SaveI, intVal N1)]::L1) EE4 NN3 : names [[(SaveI, intVal N1)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
< apply drop_one to NN1. Subgoal 4.15.17.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 Len4 : length EE4 Len NN : length EE4 Len NN1 : drop 1 ([(SaveI, intVal N1)]::EE4) EE4 NN3 : names [[(SaveI, intVal N1)]] SNames NN4 : names EE4 BNames NN5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ [(SaveI, intVal N1)]::EE4 = [(SaveI, intVal N1)]::EE4
< search. Subgoal 4.15.17.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 ** R5 : lookupScopes L (S1::BR) LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 (S1::BR) EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 Len4 : length (S1::BR) Len NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR ============================ S1::AR = [(SaveI, intVal N1)]::(S1::BR)
< LenBR: case Len4. Subgoal 4.15.17.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 ** R5 : lookupScopes L (S1::BR) LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 (S1::BR) EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ S1::AR = [(SaveI, intVal N1)]::(S1::BR)
< apply length_is to LenBR. Subgoal 4.15.17.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 ** R5 : lookupScopes L (S1::BR) LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 (S1::BR) EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H21 : is_integer N' ============================ S1::AR = [(SaveI, intVal N1)]::(S1::BR)
< L: apply lt_plus_one to LenBR1 _. Subgoal 4.15.17.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 ** R5 : lookupScopes L (S1::BR) LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 (S1::BR) EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H21 : is_integer N' L : N' < Len ============================ S1::AR = [(SaveI, intVal N1)]::(S1::BR)
< LEq: apply newNameScopes_length to NN LenBR. Subgoal 4.15.17.2: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 ** R5 : lookupScopes L (S1::BR) LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 (S1::BR) EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V (S1::BR) O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H21 : is_integer N' L : N' < Len LEq : Len <= N' ============================ S1::AR = [(SaveI, intVal N1)]::(S1::BR)
< apply less_lesseq_flip_false to L LEq. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4 Len4 : length EE4 Len Eq : EE_A'1 = [(SaveI, intVal N1)]::EE4 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< case Eq. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply IH to EvE' A2 _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvAE: assert <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply fresh_name_is to _ Pr3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsEE4: apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvMI: assert <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []. Subgoal 4.15.18: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
< assert SaveE = SaveI -> false. Subgoal 4.15.18.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ SaveE = SaveI -> false
< intros E. Subgoal 4.15.18.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 E : SaveE = SaveI ============================ false
< case E. Subgoal 4.15.18.1: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveI Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveI = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveI -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveI -> false H15 : Copy = Hold -> false H16 : SaveI = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveI H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ false
< backchain NEqIE. Subgoal 4.15.18: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 H24 : SaveE = SaveI -> false ============================ <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsEE4: apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Names4: apply names_exists to IsEE4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply names_is to _ Names4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvH: assert <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (exactEval:list:nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []. Subgoal 4.15.19: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 ============================ <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
< search 6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsSaveI: apply fresh_name_is to _ Pr1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsHold: apply fresh_name_is to _ Pr2. Subgoal 4.15.20: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI ============================ is_string "Hold"
< search 6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsCopy: apply fresh_name_is to _ Pr4. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< GEq: apply updateListIndex_pos to R6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with OldL = LV I = N1 V = V NewL = LV2 Hold = Hold Copy = Copy SaveI = SaveI SaveE = SaveE G = EE4 L = L HoldL = recVal [("null", trueVal)]. Subgoal 4.15.21: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4)
< search 12. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< exists G'. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 IsO3 : is_list is_value O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply is_list_values_append_nil to IsO3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N3 + N2 = N4 R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 ** R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 ** R5 : lookupScopes L EE4 LV R6 : updateListIndex LV N1 V LV2 R7 : replaceScopes L LV2 EE4 EE' R8 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E Ev : evalExpr FE EE I (intVal N1) EE2 O2 Ev1 : evalExpr FE EE2 E V EE4 O3 H1 : is_integer N3 H2 : is_integer N2 H3 : is_integer N4 L4 : N4 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N3 H5 : 0 <= N2 L2 : N2 < N L3 : N3 < N A2 : acc N2 * A3 : acc N3 * H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2 H8 : <evalExpr {P}> FE EE2 E V EE4 O3 Names : names EE N5 IsNames : is_list is_string N5 Is+ : is_list is_string (L::N5) Pr3 : fresh_name "E" (L::N5) SaveE Pr1 : fresh_name "I" (L::N5) SaveI Pr2 : fresh_name "Hold" (L::N5) Hold Pr4 : fresh_name "C" (L::N5) Copy H9 : SaveE = L -> false H10 : SaveI = L -> false H11 : Hold = L -> false H12 : Copy = L -> false H13 : Hold = SaveE -> false H14 : Hold = SaveI -> false NEqIE : SaveI = SaveE -> false H15 : Copy = Hold -> false H16 : SaveE = Copy -> false H17 : SaveI = Copy -> false LenEE : length EE Len NNS : newNameScopes [[]] Len ([]::EE) EE EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3 EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2 NNS' : newNameScopes [[]] Len ([]::EE2) EE2 H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2 H19 : is_string SaveI H20 : is_value (intVal N1) IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2 Names2 : names EE2 N6 NS : names_same EE EE2 Len2 : length EE2 Len NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2 EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2 EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4 Len4 : length EE4 Len H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3 H22 : is_string SaveE H23 : is_value V IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4 EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4 Names4 : names EE4 N7 H24 : is_list is_string N7 EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [] IsSaveI : is_string SaveI IsHold : is_string Hold IsCopy : is_string Copy GEq : N1 >= 0 H25 : is_value V Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] Main1 : lookup HFs "null" trueVal Main2 : replaceScopes L LV1 EE4 G' Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1 IsO3 : is_list is_value O3 H26 : O3 ++ [] = O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< search 20. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (listForeach X L Body) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IsS: case IsS. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply ext_size_is_int_evalExpr to R3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply ext_size_is_int_iterateList to R4. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply ext_size_pos_evalExpr to R3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply ext_size_pos_iterateList to R4. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply plus_integer_is_integer to _ _ R2. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< L4: apply lt_plus_one to R1 _. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Acc': case Acc (keep). Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< L2: assert N2 < N. Subgoal 4.16.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ N2 < N
< Or: apply lt_left to R2 _ _. Subgoal 4.16.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * Or : N2 < N4 \/ N2 = N4 ============================ N2 < N
< L': case Or. Subgoal 4.16.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 ============================ N2 < N
< apply less_integer_transitive to L' L4. Subgoal 4.16.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 H6 : N2 < N ============================ N2 < N
< search. Subgoal 4.16.1.2: Variables: N FE EE EE' O N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N4 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N4 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N4 H2 : is_integer N3 H3 : 0 <= N4 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ N4 < N
< search. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< L3: assert N3 < N. Subgoal 4.16.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ N3 < N
< Or: apply lt_right to R2 _ _ _. Subgoal 4.16.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N Or : N3 < N4 \/ N3 = N4 ============================ N3 < N
< L': case Or. Subgoal 4.16.2.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L' : N3 < N4 ============================ N3 < N
< apply less_integer_transitive to L' L4. Subgoal 4.16.2.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L' : N3 < N4 H6 : N3 < N ============================ N3 < N
< search. Subgoal 4.16.2.2: Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N4 H3 : 0 <= N2 H4 : 0 <= N4 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N ============================ N4 < N
< search. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< A2: apply Acc' to _ L2. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply IH to R3 A2 _ _ _. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Ev: apply drop_ext_size_evalExpr to R3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< A3: apply Acc' to _ L3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< ILP: apply IH10 to R4 A3 _ _ _ _ _. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< EvE: apply drop_ext_size_evalExpr to R3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IsEE3: apply evalExpr_isCtx to _ _ _ EvE. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Names: apply names_exists to IsEE. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IsN1: apply names_is to _ Names. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Fr: apply fresh_name_exists to _ _ with Base = "L" Names = X::N1. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) F ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< LenEE3: apply length_exists_list_pair_string_value to IsEE3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 F N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) F LenEE3 : length EE3 N5 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< rename F to SaveL. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 N5 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< rename N5 to Len. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Names3: apply names_exists to IsEE3. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NS: apply evalExpr_names_same to _ _ _ EvE. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS: assert newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3. Subgoal 4.16.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
< unfold . Subgoal 4.16.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ exists N SNames BNames, ((((length EE3 Len /\ drop N ([(SaveL, LV)]::EE3) EE3) /\ take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] SNames) /\ names EE3 BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveL], N5. Subgoal 4.16.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ ((((length EE3 Len /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\ names [[(SaveL, LV)]] [SaveL]) /\ names EE3 N5) /\ (forall X, mem X [SaveL] -> mem X N5 -> false)
< split. Subgoal 4.16.3.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ length EE3 Len
< search. Subgoal 4.16.3.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ drop 1 ([(SaveL, LV)]::EE3) EE3
< search. Subgoal 4.16.3.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
< search. Subgoal 4.16.3.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ names [[(SaveL, LV)]] [SaveL]
< search. Subgoal 4.16.3.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ names EE3 N5
< search. Subgoal 4.16.3.6: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 ============================ forall X, mem X [SaveL] -> mem X N5 -> false
< intros MSL MX. Subgoal 4.16.3.6: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 MSL : mem X1 [SaveL] MX : mem X1 N5 ============================ false
< MSL: case MSL. Subgoal 4.16.3.6.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 MX : mem SaveL N5 ============================ false
< NS': apply names_same_symmetric to NS. Subgoal 4.16.3.6.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 MX : mem SaveL N5 NS' : names_same EE3 EE ============================ false
< MX1: apply names_same_names to NS' Names3 Names MX. Subgoal 4.16.3.6.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 MX : mem SaveL N5 NS' : names_same EE3 EE MX1 : mem SaveL N1 ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 4.16.3.6.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 MX : mem X1 N5 MSL : mem X1 [] ============================ false
< case MSL. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply fresh_name_is to _ Fr. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< ILP': apply iterateList_newNameScopes_exists_ES to _ _ _ _ _ _ R4 NNS. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IL: apply drop_ext_size_iterateList to R4. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IL': apply drop_ext_size_iterateList to ILP'. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS': apply iterateList_newNameScopes to _ _ _ _ _ _ IL' IL NNS. Subgoal 4.16: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 NNS' : newNameScopes [[(SaveL, LV)]] Len EE_A' EE' ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS': case NNS'. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' N6 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 NNS' : length EE' Len NNS'1 : drop N6 EE_A' EE' NNS'2 : take N6 EE_A' [[(SaveL, LV)]] NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Take: case NNS'2. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 N6 SNames BNames N7 L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N7 = N6 Take1 : take N7 L1 [] ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< case Take1. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 N6 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N6 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< compute Take. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'1 : drop 1 ([(SaveL, LV)]::L1) EE' NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Drop: case NNS'1. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 N8 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop1 : drop N8 L1 EE' ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< IsN8: apply drop_is_integer to Drop1. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 N8 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N8 = 1 Drop1 : drop N8 L1 EE' IsN8 : is_integer N8 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE' IsN8 : is_integer 0 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Eq: assert L1 = EE'. Subgoal 4.16.4.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE' IsN8 : is_integer 0 ============================ L1 = EE'
< D: case Drop1. Subgoal 4.16.4.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 ============================ EE' = EE'
< search. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + N9 = 0 D1 : drop N9 L2 EE' ============================ X1::L2 = EE'
< GEq: apply drop_geq_0 to D1. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + N9 = 0 D1 : drop N9 L2 EE' GEq : N9 >= 0 ============================ X1::L2 = EE'
< apply drop_is_integer to D1. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + N9 = 0 D1 : drop N9 L2 EE' GEq : N9 >= 0 H10 : is_integer N9 ============================ X1::L2 = EE'
< P: assert 1 + -1 = 0. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + N9 = 0 D1 : drop N9 L2 EE' GEq : N9 >= 0 H10 : is_integer N9 P : 1 + -1 = 0 ============================ X1::L2 = EE'
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE' GEq : -1 >= 0 H10 : is_integer -1 P : 1 + -1 = 0 ============================ X1::L2 = EE'
< LEq: case GEq. Subgoal 4.16.4.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L2 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 IsN8 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L2 EE' H10 : is_integer -1 P : 1 + -1 = 0 LEq : 0 <= -1 ============================ X1::L2 = EE'
< case LEq. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L1 EE' IsN8 : is_integer 0 Eq : L1 = EE' ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< case Eq. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE' EE' IsN8 : is_integer 0 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< clear Take Drop Drop1 IsN8. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< ILP'': apply IH4 to ILP' A3 _ _ _ _ _. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Fr': assert fresh_name "L" (X::N5) SaveL. Subgoal 4.16.4.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 ============================ fresh_name "L" (X::N5) SaveL
< apply names_is to _ Names3. Subgoal 4.16.4.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 ============================ fresh_name "L" (X::N5) SaveL
< Fr': apply fresh_name_exists to _ _ with Base = "L" Names = X::N5. Subgoal 4.16.4.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ fresh_name "L" (X::N5) SaveL
< apply fresh_name_unique_mems to Fr Fr' _ _. Subgoal 4.16.4.2.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ forall X1, mem X1 (X::N5) -> mem X1 (X::N1)
< intros M. Subgoal 4.16.4.2.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 (X::N5) ============================ mem X1 (X::N1)
< M: case M. Subgoal 4.16.4.2.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ mem X (X::N1)
< search. Subgoal 4.16.4.2.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 N5 ============================ mem X1 (X::N1)
< NS': apply names_same_symmetric to NS. Subgoal 4.16.4.2.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 N5 NS' : names_same EE3 EE ============================ mem X1 (X::N1)
< apply names_same_names to NS' Names3 Names M. Subgoal 4.16.4.2.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 N5 NS' : names_same EE3 EE H11 : mem X1 N1 ============================ mem X1 (X::N1)
< search. Subgoal 4.16.4.2.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ forall X1, mem X1 (X::N1) -> mem X1 (X::N5)
< intros M. Subgoal 4.16.4.2.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 (X::N1) ============================ mem X1 (X::N5)
< M: case M. Subgoal 4.16.4.2.2.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ mem X (X::N5)
< search. Subgoal 4.16.4.2.2.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 N1 ============================ mem X1 (X::N5)
< apply names_same_names to NS Names Names3 M. Subgoal 4.16.4.2.2.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F M : mem X1 N1 H11 : mem X1 N5 ============================ mem X1 (X::N5)
< search. Subgoal 4.16.4.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 Len N5 SNames BNames F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) F LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(F, LV)]] Len ([(F, LV)]::EE3) EE3 H9 : is_string F ILP' : <iterateList {ES}> FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(F, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3 H10 : is_list is_string N5 Fr' : fresh_name "L" (X::N5) F ============================ fresh_name "L" (X::N5) F
< search. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Plus: apply plus_integer_total to _ _ with N1 = 1 N2 = N3. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< EvWP: assert exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3. Subgoal 4.16.4.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< Or: apply lt_right to R2 _ _ _. Subgoal 4.16.4.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 Or : N3 < N4 \/ N3 = N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< L: case Or. Subgoal 4.16.4.3.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< LEq: apply less_integer_step_lesseq to _ _ L Plus. Subgoal 4.16.4.3.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< Or: apply lesseq_integer_less_or_eq to LEq. Subgoal 4.16.4.3.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 Or : N9 < N4 \/ N9 = N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< L': case Or. Subgoal 4.16.4.3.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 L' : N9 < N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< L9: apply less_integer_transitive to L' L4. Subgoal 4.16.4.3.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 L' : N9 < N4 L9 : N9 < N ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply lesseq_integer__add_positive to _ _ Plus with Base = 0. Subgoal 4.16.4.3.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 L' : N9 < N4 L9 : N9 < N H10 : 0 <= N9 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< A9: apply Acc' to _ L9. Subgoal 4.16.4.3.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 L' : N9 < N4 L9 : N9 < N H10 : 0 <= N9 A9 : acc N9 * ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply IH_IL_W to _ _ _ _ _ R4 Plus A9 Names3 Fr'. Subgoal 4.16.4.3.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 L : N3 < N4 LEq : N9 <= N4 L' : N9 < N4 L9 : N9 < N H10 : 0 <= N9 A9 : acc N9 * H11 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< search. Subgoal 4.16.4.3.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N4 L : N3 < N4 LEq : N4 <= N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply lesseq_integer__add_positive to _ _ R2 with Base = 0. Subgoal 4.16.4.3.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N4 L : N3 < N4 LEq : N4 <= N4 H10 : 0 <= N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< A4: apply Acc' to _ L4. Subgoal 4.16.4.3.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N4 L : N3 < N4 LEq : N4 <= N4 H10 : 0 <= N4 A4 : acc N4 * ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply IH_IL_W to _ _ _ _ _ R4 Plus A4 Names3 Fr'. Subgoal 4.16.4.3.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N4 L : N3 < N4 LEq : N4 <= N4 H10 : 0 <= N4 A4 : acc N4 * H11 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< search. Subgoal 4.16.4.3.2: Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N4 H3 : 0 <= N2 H4 : 0 <= N4 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N4 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N4 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N4 = N9 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply plus_integer_unique to Plus R1. Subgoal 4.16.4.3.2: Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N4 H3 : 0 <= N2 H4 : 0 <= N4 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N4 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N4 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N4 = N ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< apply IH_IL_W to _ _ _ _ _ R4 Plus Acc Names3 Fr'. Subgoal 4.16.4.3.2: Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N4 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N4 H3 : 0 <= N2 H4 : 0 <= N4 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N4 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N4 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N4 = N H10 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< search. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : exists V', <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< EvWP: case EvWP. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< LenEE: apply length_exists_list_pair_string_value to IsEE. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS_: assert newNameScopes [[]] N11 ([]::EE) EE. Subgoal 4.16.4.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ newNameScopes [[]] N11 ([]::EE) EE
< unfold . Subgoal 4.16.4.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ exists N SNames BNames, ((((length EE N11 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\ names [[]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [], N1. Subgoal 4.16.4.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ ((((length EE N11 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\ names [[]] []) /\ names EE N1) /\ (forall X, mem X [] -> mem X N1 -> false)
< split. Subgoal 4.16.4.4.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ length EE N11
< search. Subgoal 4.16.4.4.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ drop 1 ([]::EE) EE
< search. Subgoal 4.16.4.4.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ take 1 ([]::EE) [[]]
< search. Subgoal 4.16.4.4.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ names [[]] []
< search. Subgoal 4.16.4.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ names EE N1
< search. Subgoal 4.16.4.4.6: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 ============================ forall X, mem X [] -> mem X N1 -> false
< intros M. Subgoal 4.16.4.4.6: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 M : mem X1 [] H10 : mem X1 N1 ============================ false
< case M. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< EvE+: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS_. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< EvE+': apply drop_ext_size_evalExpr to EvE+. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2 EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS+: apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE+' EvE _. Subgoal 4.16.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2 EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2 NNS+ : newNameScopes [[]] N11 EE_A'1 EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NNS+: case NNS+. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1 N12 SNames1 BNames1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2 EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2 NNS+ : length EE3 N11 NNS+1 : drop N12 EE_A'1 EE3 NNS+2 : take N12 EE_A'1 [[]] NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Take: case NNS+2. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 N12 SNames1 BNames1 N13 L2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+1 : drop N12 ([]::L2) EE3 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + N13 = N12 Take1 : take N13 L2 [] ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< case Take1. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 N12 SNames1 BNames1 L2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+1 : drop N12 ([]::L2) EE3 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = N12 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< compute Take. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+1 : drop 1 ([]::L2) EE3 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Drop: case NNS+1. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 Drop1 : drop N14 L2 EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< Eq: assert L2 = EE3. Subgoal 4.16.4.5.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 Drop1 : drop N14 L2 EE3 ============================ L2 = EE3
< apply drop_is_integer to Drop1. Subgoal 4.16.4.5.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 Drop1 : drop N14 L2 EE3 H10 : is_integer N14 ============================ L2 = EE3
< D: case Drop1. Subgoal 4.16.4.5.1.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 N15 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 H10 : is_integer N14 D : 1 + N15 = N14 D1 : drop N15 L3 EE3 ============================ X1::L3 = EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + N15 = 0 D1 : drop N15 L3 EE3 ============================ X1::L3 = EE3
< P: assert 1 + -1 = 0. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + N15 = 0 D1 : drop N15 L3 EE3 P : 1 + -1 = 0 ============================ X1::L3 = EE3
< apply drop_is_integer to D1. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + N15 = 0 D1 : drop N15 L3 EE3 P : 1 + -1 = 0 H11 : is_integer N15 ============================ X1::L3 = EE3
< apply plus_integer_unique_addend to _ _ _ P D. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L3 EE3 P : 1 + -1 = 0 H11 : is_integer -1 ============================ X1::L3 = EE3
< GEq: apply drop_geq_0 to D1. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L3 EE3 P : 1 + -1 = 0 H11 : is_integer -1 GEq : -1 >= 0 ============================ X1::L3 = EE3
< LEq: case GEq. Subgoal 4.16.4.5.1.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H10 : is_integer 0 D : 1 + -1 = 0 D1 : drop -1 L3 EE3 P : 1 + -1 = 0 H11 : is_integer -1 LEq : 0 <= -1 ============================ X1::L3 = EE3
< case LEq. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 Drop1 : drop N14 L2 EE3 Eq : L2 = EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< case Eq. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 NNS+ : length EE3 N11 NNS+3 : names [[]] SNames1 NNS+4 : names EE3 BNames1 NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false Take : 1 + 0 = 1 Drop : 1 + N14 = 1 Drop1 : drop N14 EE3 EE3 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< clear Take Drop Drop1 NNS+4 NNS+3 NNS+5 NNS+. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< unfold . Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ exists Names S_P EE_P O_P LV EE1 O1 O2, (<evalExpr {P}> FE EE L LV EE1 O1 /\ (<iterateList {P}> FE EE1 LV X Body EE' O2 /\ O1 ++ O2 = O)) /\ (names EE Names /\ (Names |{stmt}- listForeach X L Body ~~> S_P /\ <evalStmt {P}> FE EE S_P EE_P O_P))
< exists N1, scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))), EE', O, LV, EE3, O2, O3. Subgoal 4.16.4.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ (<evalExpr {P}> FE EE L LV EE3 O2 /\ (<iterateList {P}> FE EE3 LV X Body EE' O3 /\ O2 ++ O3 = O)) /\ (names EE N1 /\ (N1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) /\ <evalStmt {P}> FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O))
< split. Subgoal 4.16.4.5.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalExpr {P}> FE EE L LV EE3 O2
< search. Subgoal 4.16.4.5.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <iterateList {P}> FE EE3 LV X Body EE' O3
< search. Subgoal 4.16.4.5.4: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ O2 ++ O3 = O
< search. Subgoal 4.16.4.5.5: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ names EE N1
< search. Subgoal 4.16.4.5.6: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ N1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
< search. Subgoal 4.16.4.5.7: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
< unfold . Subgoal 4.16.4.5.7: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ exists Scope, <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) (Scope::EE') O
< exists [(SaveL, V')]. Subgoal 4.16.4.5.7: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) ([(SaveL, V')]::EE') O
< unfold . Subgoal 4.16.4.5.7: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) EE1 O1 /\ (<evalStmt {P}> FE EE1 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O2 /\ O1 ++ O2 = O)
< exists [(SaveL, LV)]::EE3, O2, O3. Subgoal 4.16.4.5.7: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 /\ (<evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 /\ O2 ++ O3 = O)
< split. Subgoal 4.16.4.5.7.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
< apply IH to EvE+ A2 _ _ _. Subgoal 4.16.4.5.7.1: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 H10 : <evalExpr {P}> FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
< search. Subgoal 4.16.4.5.7.2: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
< search. Subgoal 4.16.4.5.7.3: Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body EE' O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE EE3 LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2 ============================ O2 ++ O3 = O
< search. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< NSE: apply evalExpr_names_same to _ _ _ EvE. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< LenBR+: apply names_same_length to NSE LenEE. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) LenBR+ : length (S1::BR) N11 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< LenBR: case LenBR+. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = N11 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply length_is to LenBR. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = N11 H10 : is_integer N' ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< L: apply lt_plus_one to LenBR1 _. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = N11 H10 : is_integer N' L : N' < N11 ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< LEq: apply newNameScopes_length to NNS+ LenBR. Subgoal 4.16.4.6: Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 ** R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2 Ev : evalExpr FE EE L LV (S1::BR) O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR) A3 : acc N3 * ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3 EvE : evalExpr FE EE L LV (S1::BR) O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR) Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length (S1::BR) Len Names3 : names (S1::BR) N5 NS : names_same EE (S1::BR) NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR) H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3 IL : iterateList FE (S1::BR) LV X Body EE' O3 IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 NNS' : length EE' Len NNS'3 : names [[(SaveL, LV)]] SNames NNS'4 : names EE' BNames NNS'5 : forall X, mem X SNames -> mem X BNames -> false ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 Fr' : fresh_name "L" (X::N5) SaveL Plus : 1 + N3 = N9 EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 LenEE : length EE N11 NNS_ : newNameScopes [[]] N11 ([]::EE) EE EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2 EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2 NNS+ : newNameScopes [[]] N11 AR BR NSE : names_same EE (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = N11 H10 : is_integer N' L : N' < N11 LEq : N11 <= N' ============================ <evalStmt {P}> FE EE (listForeach X L Body) EE' O
< apply less_lesseq_flip_false to L LEq. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< NSI: apply iterateList_names_same to _ _ _ _ _ IL. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< LenBR+: apply names_same_length to NSI LenEE3. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) LenBR+ : length (S1::BR) Len ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< LenBR: case LenBR+. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< apply length_is to LenBR. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< L: apply lt_plus_one to LenBR1 _. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 4.16.5: Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 -> exists V', <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 ** R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 ** R5 : O2 ++ O3 = O IsS : is_string X IsS1 : is_expr L IsS2 : is_stmt Body H1 : is_integer N2 H2 : is_integer N3 H3 : 0 <= N2 H4 : 0 <= N3 H5 : is_integer N4 L4 : N4 < N Acc' : forall M, 0 <= M -> M < N -> acc M * L2 : N2 < N L3 : N3 < N A2 : acc N2 * H6 : <evalExpr {P}> FE EE L LV EE3 O2 Ev : evalExpr FE EE L LV EE3 O2 H7 : is_value LV H8 : is_list (is_list (is_pair is_string is_value)) EE3 A3 : acc N3 * ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3 EvE : evalExpr FE EE L LV EE3 O2 IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3 Names : names EE N1 IsN1 : is_list is_string N1 Fr : fresh_name "L" (X::N1) SaveL LenEE3 : length EE3 Len Names3 : names EE3 N5 NS : names_same EE EE3 NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3 H9 : is_string SaveL ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3 IL : iterateList FE EE3 LV X Body (S1::BR) O3 IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR NSI : names_same EE3 (S1::BR) LenBR : length BR N' LenBR1 : 1 + N' = Len H10 : is_integer N' L : N' < Len LEq : Len <= N' ============================ <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
< apply less_lesseq_flip_false to L LEq. Subgoal 5.1: Variables: FE X Body EE' Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE' (recVal Fields) X Body EE' [] 0 @@ Acc : acc 0 @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body R1 : lookup Fields "null" trueVal ============================ <iterateList {P}> FE EE' (recVal Fields) X Body EE' []
< search. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< case IsV. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply lookup_is_value to _ R3. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply lookup_is_value to _ R5. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< Ev: apply drop_ext_size_evalStmt to R4. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< IL: apply drop_ext_size_iterateList to R6. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< IsEE3+: apply evalStmt_isCtx to _ _ _ Ev. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< case IsEE3+. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply ext_size_is_int_evalStmt to R4. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply ext_size_is_int_iterateList to R6. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply plus_integer_is_integer to _ _ R1. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< Acc': case Acc (keep). Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply ext_size_pos_evalStmt to R4. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< apply ext_size_pos_iterateList to R6. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< assert <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2. Subgoal 5.2.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< Or: apply lt_left to R1 _ _. Subgoal 5.2.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 Or : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< L': case Or. Subgoal 5.2.1.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 L' : N2 < N ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< A2: apply Acc' to _ L'. Subgoal 5.2.1.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 L' : N2 < N A2 : acc N2 * ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< apply IH9 to R4 A2 _ _ _. Subgoal 5.2.1.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 L' : N2 < N A2 : acc N2 * H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< search. Subgoal 5.2.1.2: Variables: N FE EE X Body EE' O N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N H10 : 0 <= N3 ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< apply IH9 to R4 Acc _ _ _. Subgoal 5.2.1.2: Variables: N FE EE X Body EE' O N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
< search. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< assert <iterateList {P}> FE EE3 Tl X Body EE' O3. Subgoal 5.2.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< Or: apply lt_right to R1 _ _ _. Subgoal 5.2.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Or : N3 < N \/ N3 = N ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< L': case Or. Subgoal 5.2.2.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 L' : N3 < N ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< A3: apply Acc' to _ L'. Subgoal 5.2.2.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 L' : N3 < N A3 : acc N3 * ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< apply IH10 to R6 A3 _ _ _ _ _. Subgoal 5.2.2.1: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 L' : N3 < N A3 : acc N3 * H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3 ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< search. Subgoal 5.2.2.2: Variables: N FE EE X Body EE' O N2 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< apply IH10 to R6 Acc _ _ _ _ _. Subgoal 5.2.2.2: Variables: N FE EE X Body EE' O N2 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3 ============================ <iterateList {P}> FE EE3 Tl X Body EE' O3
< search. Subgoal 5.2: Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsX : is_string X IsBody : is_stmt Body R1 : N2 + N3 = N R2 : lookup Fields "null" falseVal R3 : lookup Fields "head" Hd R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** R5 : lookup Fields "tail" Tl R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** R7 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 IL : iterateList FE EE3 Tl X Body EE' O3 H4 : is_list (is_pair is_string is_value) Scope H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_integer N2 H7 : is_integer N3 H8 : is_integer N Acc' : forall M, 0 <= M -> M < N -> acc M * H9 : 0 <= N2 H10 : 0 <= N3 H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3 ============================ <iterateList {P}> FE EE (recVal Fields) X Body EE' O
< search. Subgoal 6.1: Variables: FE SaveL X Body EE' Names N' Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE') IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE' (recVal Fields) X Body EE' [] 0 @@ Plus : 1 + 0 = N' Acc : acc N' @ Names : names EE' Names Fr : fresh_name "L" (X::Names) SaveL IL1 : lookup Fields "null" trueVal ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') []
< search 20. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsFields: case IsV. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< assert <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []. Subgoal 6.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields ============================ <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
< search 20. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< assert <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []. Subgoal 6.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] ============================ <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
< search 20. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< NEq: assert X = SaveL -> false. Subgoal 6.2.3: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] ============================ X = SaveL -> false
< intros E. Subgoal 6.2.3: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] E : X = SaveL ============================ false
< case E. Subgoal 6.2.3: Variables: FE SaveL EE Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string SaveL IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) SaveL Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (SaveL::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(SaveL, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl SaveL Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy SaveL (head (name SaveL))) ([(SaveL, Hd)]::([(SaveL, recVal Fields)]::EE)) [] ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< assert <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []. Subgoal 6.2.4: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
< search 20. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsSaveL: apply fresh_name_is to _ Fr. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsHd: apply lookup_is_value to _ IL3. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsTl: apply lookup_is_value to _ IL5. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE) IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsEE: case IsEE. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< LenEE: apply length_exists_list_pair_string_value to IsEE1. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE N1 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< rename N1 to Len. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Acc': case Acc (keep). Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< NNS: assert newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE. Subgoal 6.2.5: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
< unfold . Subgoal 6.2.5: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([(SaveL, Tl)]::EE) EE) /\ take N ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]) /\ names [[(SaveL, Tl)]] SNames) /\ names EE BNames) /\ (forall X, mem X SNames -> mem X BNames -> false)
< exists 1, [SaveL], Names. Subgoal 6.2.5: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ ((((length EE Len /\ drop 1 ([(SaveL, Tl)]::EE) EE) /\ take 1 ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]) /\ names [[(SaveL, Tl)]] [SaveL]) /\ names EE Names) /\ (forall X, mem X [SaveL] -> mem X Names -> false)
< split. Subgoal 6.2.5.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ length EE Len
< search. Subgoal 6.2.5.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ drop 1 ([(SaveL, Tl)]::EE) EE
< search. Subgoal 6.2.5.3: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ take 1 ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]
< search. Subgoal 6.2.5.4: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ names [[(SaveL, Tl)]] [SaveL]
< search. Subgoal 6.2.5.5: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ names EE Names
< search. Subgoal 6.2.5.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ============================ forall X, mem X [SaveL] -> mem X Names -> false
< intros ML MN. Subgoal 6.2.5.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * ML : mem X1 [SaveL] MN : mem X1 Names ============================ false
< ML: case ML. Subgoal 6.2.5.6.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * MN : mem SaveL Names ============================ false
< apply fresh_name_not_mem to Fr _. Subgoal 6.2.5.6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * MN : mem X1 Names ML : mem X1 [] ============================ false
< case ML. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Ev: apply evalStmt_newNameScopes_exists_ES to _ _ _ _ IL4 NNS. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply ext_size_is_int_iterateList to IL. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< LN: apply lt_plus_one to Plus _. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< EvP: assert <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2. Subgoal 6.2.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply ext_size_is_int_evalStmt to IL4. Subgoal 6.2.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply ext_size_pos_evalStmt to IL4. Subgoal 6.2.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply ext_size_pos_iterateList to IL6. Subgoal 6.2.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< Or: apply lt_left to IL1 _ _. Subgoal 6.2.6: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 Or : N2 < N \/ N2 = N ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< L: case Or. Subgoal 6.2.6.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 L : N2 < N ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< L': apply less_integer_transitive to L LN. Subgoal 6.2.6.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 L : N2 < N L' : N2 < N' ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< A2: apply Acc' to _ L'. Subgoal 6.2.6.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 L : N2 < N L' : N2 < N' A2 : acc N2 * ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply IH3 to Ev A2 _ _ _. Subgoal 6.2.6.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' H5 : is_integer N2 H6 : 0 <= N2 H7 : 0 <= N3 L : N2 < N L' : N2 < N' A2 : acc N2 * H8 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< search. Subgoal 6.2.6.2: Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N H4 : is_integer N LN : N < N' H5 : is_integer N H6 : 0 <= N H7 : 0 <= N3 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< A2: apply Acc' to _ LN. Subgoal 6.2.6.2: Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N H4 : is_integer N LN : N < N' H5 : is_integer N H6 : 0 <= N H7 : 0 <= N3 A2 : acc N * ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply IH3 to Ev A2 _ _ _. Subgoal 6.2.6.2: Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N H4 : is_integer N LN : N < N' H5 : is_integer N H6 : 0 <= N H7 : 0 <= N3 A2 : acc N * H8 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< search. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Ev': apply drop_ext_size_evalStmt to Ev. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< EvB: apply drop_ext_size_evalStmt to IL4. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Eq: assert EE_A' = Scope::([(SaveL, Tl)]::EE3). Subgoal 6.2.7: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< NNS+: apply evalStmt_newNameScopes to _ _ _ _ Ev' EvB NNS. Subgoal 6.2.7: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len EE_A' (Scope::EE3) ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< NNS+: case NNS+. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< IsLen: apply length_is to LenEE. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< P: apply plus_integer_total to _ IsLen with N1 = 1. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len P : 1 + Len = N4 ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< LenEE+: assert length ([(X, Hd)]::EE) N4. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len P : 1 + Len = N4 LenEE+ : length ([(X, Hd)]::EE) N4 ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< LenEE3+: apply evalStmt_keep_scopes to _ _ _ EvB LenEE+. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len P : 1 + Len = N4 LenEE+ : length ([(X, Hd)]::EE) N4 LenEE3+ : length (Scope::EE3) N4 ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< apply length_unique to LenEE3+ NNS+. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len P : 1 + Len = Len LenEE+ : length ([(X, Hd)]::EE) Len LenEE3+ : length (Scope::EE3) Len ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< L: apply lt_plus_one to P _. Subgoal 6.2.7.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length (Scope::EE3) Len NNS+1 : drop N1 EE_A' (Scope::EE3) NNS+2 : take N1 EE_A' [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names (Scope::EE3) BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false IsLen : is_integer Len P : 1 + Len = Len LenEE+ : length ([(X, Hd)]::EE) Len LenEE3+ : length (Scope::EE3) Len L : Len < Len ============================ EE_A' = Scope::([(SaveL, Tl)]::EE3)
< apply less_integer_not_eq to L. Subgoal 6.2.7.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len AR IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR EE3 ============================ Scope::AR = Scope::([(SaveL, Tl)]::EE3)
< NNS+: case NNS+. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len AR N1 SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+1 : drop N1 AR EE3 NNS+2 : take N1 AR [[(SaveL, Tl)]] NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false ============================ Scope::AR = Scope::([(SaveL, Tl)]::EE3)
< Take: case NNS+2. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 SNames BNames N4 L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+1 : drop N1 ([(SaveL, Tl)]::L) EE3 NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + N4 = N1 Take1 : take N4 L [] ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< case Take1. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+1 : drop N1 ([(SaveL, Tl)]::L) EE3 NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = N1 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< compute Take. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+1 : drop 1 ([(SaveL, Tl)]::L) EE3 NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< Drop: case NNS+1. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop1 : drop N5 L EE3 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< apply drop_is_integer to Drop1. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L N5 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + N5 = 1 Drop1 : drop N5 L EE3 H5 : is_integer N5 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H5 : is_integer 0 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< Eq: assert L = EE3. Subgoal 6.2.7.2.1.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H5 : is_integer 0 ============================ L = EE3
< Drop': case Drop1. Subgoal 6.2.7.2.1.1.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + N6 = 0 Drop'1 : drop N6 L1 EE3 ============================ X1::L1 = EE3
< GEq: apply drop_geq_0 to Drop'1. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + N6 = 0 Drop'1 : drop N6 L1 EE3 GEq : N6 >= 0 ============================ X1::L1 = EE3
< P: assert 1 + -1 = 0. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + N6 = 0 Drop'1 : drop N6 L1 EE3 GEq : N6 >= 0 P : 1 + -1 = 0 ============================ X1::L1 = EE3
< apply drop_is_integer to Drop'1. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + N6 = 0 Drop'1 : drop N6 L1 EE3 GEq : N6 >= 0 P : 1 + -1 = 0 H6 : is_integer N6 ============================ X1::L1 = EE3
< apply plus_integer_unique_addend to _ _ _ P Drop'. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE3 GEq : -1 >= 0 P : 1 + -1 = 0 H6 : is_integer -1 ============================ X1::L1 = EE3
< LEq: case GEq. Subgoal 6.2.7.2.1.1.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L1 X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H5 : is_integer 0 Drop' : 1 + -1 = 0 Drop'1 : drop -1 L1 EE3 P : 1 + -1 = 0 H6 : is_integer -1 LEq : 0 <= -1 ============================ X1::L1 = EE3
< case LEq. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H5 : is_integer 0 Eq : L = EE3 ============================ Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
< case Eq. Subgoal 6.2.7.2.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 NNS+ : length EE3 Len NNS+3 : names [[(SaveL, Tl)]] SNames NNS+4 : names EE3 BNames NNS+5 : forall X, mem X SNames -> mem X BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 EE3 EE3 H5 : is_integer 0 ============================ Scope::([(SaveL, Tl)]::EE3) = Scope::([(SaveL, Tl)]::EE3)
< search. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< IsLen: apply length_is to LenEE. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< P: apply plus_integer_total to _ IsLen with N1 = 1. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< LenEE+: assert length ([(X, Hd)]::EE) N1. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< LenBR++: apply evalStmt_keep_scopes to _ _ _ EvB LenEE+. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR++ : length (Scope::(S::BR)) N1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< LenBR+: case LenBR++. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+ : length (S::BR) N'1 LenBR+1 : 1 + N'1 = N1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< apply length_is to LenBR+. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+ : length (S::BR) N'1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< LenBR: case LenBR+. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 LenBR : length BR N'2 LenBR1 : 1 + N'2 = N'1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< apply length_is to LenBR. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 LenBR : length BR N'2 LenBR1 : 1 + N'2 = N'1 H6 : is_integer N'2 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< LEq: apply newNameScopes_length to NNS+ LenBR. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR IsLen : is_integer Len P : 1 + Len = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 LenBR : length BR N'2 LenBR1 : 1 + N'2 = N'1 H6 : is_integer N'2 LEq : Len <= N'2 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< apply plus_integer_unique_addend to _ _ _ P LenBR+1. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields BR S AR1 N1 N'1 N'2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE N'1 Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] N'1 ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] N'1 AR1 BR IsLen : is_integer N'1 P : 1 + N'1 = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 LenBR : length BR N'2 LenBR1 : 1 + N'2 = N'1 H6 : is_integer N'2 LEq : N'1 <= N'2 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< L: apply lt_plus_one to LenBR1 _. Subgoal 6.2.7.2.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields BR S AR1 N1 N'1 N'2 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE N'1 Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] N'1 ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 NNS+ : newNameScopes [[(SaveL, Tl)]] N'1 AR1 BR IsLen : is_integer N'1 P : 1 + N'1 = N1 LenEE+ : length ([(X, Hd)]::EE) N1 LenBR+1 : 1 + N'1 = N1 H5 : is_integer N'1 LenBR : length BR N'2 LenBR1 : 1 + N'2 = N'1 H6 : is_integer N'2 LEq : N'1 <= N'2 L : N'2 < N'1 ============================ Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
< apply less_lesseq_flip_false to L LEq. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Eq : EE_A' = Scope::([(SaveL, Tl)]::EE3) ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< case Eq. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Is': apply evalStmt_isCtx to _ _ _ Ev'. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_list (is_pair is_string is_value)) (Scope::([(SaveL, Tl)]::EE3)) ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Is': case Is'. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< IsN3: apply ext_size_is_int_iterateList to IL6. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) IsN3 : is_integer N3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply ext_size_pos_iterateList to IL6. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) IsN3 : is_integer N3 H5 : 0 <= N3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< P: apply plus_integer_total to _ IsN3 with N1 = 1. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply lesseq_integer__add_positive to _ _ P with Base = 0. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply ext_size_pos_evalStmt to IL4. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3) IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Is'': case Is'1. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< N: apply names_exists to Is''1. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE3 N : names EE3 N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply names_is to _ N. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE3 N : names EE3 N4 H8 : is_list is_string N4 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Fr': apply fresh_name_exists to _ _ with Base = "L" Names = X::N4. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4 F IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 Is' : is_list (is_pair is_string is_value) Scope IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE3 N : names EE3 N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< NS: apply evalStmt_names_same to _ _ _ EvB. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply fresh_name_unique_mems to Fr' Fr _ _. Subgoal 6.2.8: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ forall X1, mem X1 (X::Names) -> mem X1 (X::N4)
< intros M. Subgoal 6.2.8: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 (X::Names) ============================ mem X1 (X::N4)
< M: case M. Subgoal 6.2.8.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ mem X (X::N4)
< search. Subgoal 6.2.8.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 Names ============================ mem X1 (X::N4)
< apply names_same_names to NS Names N M. Subgoal 6.2.8.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 Names H9 : mem X1 N4 ============================ mem X1 (X::N4)
< search. Subgoal 6.2.9: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ forall X1, mem X1 (X::N4) -> mem X1 (X::Names)
< intros M. Subgoal 6.2.9: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 (X::N4) ============================ mem X1 (X::Names)
< M: case M. Subgoal 6.2.9.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' ============================ mem X (X::Names)
< search. Subgoal 6.2.9.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 ============================ mem X1 (X::Names)
< NS': apply names_same_symmetric to NS. Subgoal 6.2.9.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 NS' : names_same EE'' EE ============================ mem X1 (X::Names)
< apply names_same_names to NS' N Names M. Subgoal 6.2.9.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) F NS : names_same EE EE'' M : mem X1 N4 NS' : names_same EE'' EE H9 : mem X1 Names ============================ mem X1 (X::Names)
< search. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Or: apply lt_right to IL1 _ _ _. Subgoal 6.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' Or : N3 < N \/ N3 = N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< L: case Or. Subgoal 6.2.10: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< LEq: apply less_integer_step_lesseq to _ _ L P. Subgoal 6.2.10: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< Or: apply lesseq_integer_less_or_eq to LEq. Subgoal 6.2.10: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N Or : N1 < N \/ N1 = N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< L': case Or. Subgoal 6.2.10.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N L' : N1 < N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< L'': apply less_integer_transitive to L' LN. Subgoal 6.2.10.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N L' : N1 < N L'' : N1 < N' ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< A: apply Acc' to _ L''. Subgoal 6.2.10.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N L' : N1 < N L'' : N1 < N' A : acc N1 * ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply IH_IL_W to _ _ _ _ _ IL6 P A N Fr'. Subgoal 6.2.10.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N1 <= N L' : N1 < N L'' : N1 < N' A : acc N1 * H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< search. Subgoal 6.2.10.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N H6 : 0 <= N H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N <= N ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< A: apply Acc' to _ LN. Subgoal 6.2.10.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N H6 : 0 <= N H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N <= N A : acc N * ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply IH_IL_W to _ _ _ _ _ IL6 P A N Fr'. Subgoal 6.2.10.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE'' V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N3 = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N3 H5 : 0 <= N3 P : 1 + N3 = N H6 : 0 <= N H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' L : N3 < N LEq : N <= N A : acc N * H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< search. Subgoal 6.2.11: Variables: FE SaveL EE X Body EE' O Names N N' N2 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N H5 : 0 <= N P : 1 + N = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< apply IH_IL_W to _ _ _ _ _ IL6 Plus Acc N Fr'. Subgoal 6.2.11: Variables: FE SaveL EE X Body EE' O Names N N' N2 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' V' IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N -> 1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IH6 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH7 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH8 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH9 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH10 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N', is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) -> is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** -> 1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL -> exists V', <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsX : is_string X IsBody : is_stmt Body IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@ Plus : 1 + N = N' Acc : acc N' @ Names : names EE Names Fr : fresh_name "L" (X::Names) SaveL IL1 : N2 + N = N IL2 : lookup Fields "null" falseVal IL3 : lookup Fields "head" Hd IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 ** IL5 : lookup Fields "tail" Tl IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N ** IL7 : O2 ++ O3 = O IsFields : is_list (is_pair is_string is_value) Fields H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [] H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [] NEq : X = SaveL -> false H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [] IsSaveL : is_string SaveL IsHd : is_value Hd IsTl : is_value Tl IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)] IsEE1 : is_list (is_list (is_pair is_string is_value)) EE LenEE : length EE Len Acc' : forall M, 0 <= M -> M < N' -> acc M * NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2 H4 : is_integer N LN : N < N' EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 Is' : is_list (is_pair is_string is_value) Scope' IsN3 : is_integer N H5 : 0 <= N P : 1 + N = N1 H6 : 0 <= N1 H7 : 0 <= N2 Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)] Is''1 : is_list (is_list (is_pair is_string is_value)) EE'' N : names EE'' N4 H8 : is_list is_string N4 Fr' : fresh_name "L" (X::N4) SaveL NS : names_same EE EE'' H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 ============================ exists V', <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
< search. Proof completed.
< Prove exactEval:host:paramName_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_back. Proof completed.
< Prove exactEval:host:getFunEvalInfo_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_back. Proof completed.
< Prove exactEval:host:evalProgram_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_back. Proof completed.
< Theorem listIndex_typePres : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty. ============================ forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty
< induction on 2. IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty ============================ forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V @ -> valueType V Ty
< intros VT LI. Variables: L Ty I V IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType L (listTy Ty) LI : listIndex L I V @ ============================ valueType V Ty
< LI: case LI. Subgoal 1: Variables: Ty V Fields IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType (recVal Fields) (listTy Ty) LI : lookup Fields "head" V ============================ valueType V Ty
< VT: case VT. Subgoal 1.1: Variables: Ty V V1 IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : lookup [("null", V1)] "head" V VT : valueType V1 boolTy ============================ valueType V Ty
< L: case LI. Subgoal 1.1: Variables: Ty V V1 IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType V1 boolTy L : "null" = "head" -> false L1 : lookup [] "head" V ============================ valueType V Ty
< case L1. Subgoal 1.2: Variables: Ty V TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" V VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) ============================ valueType V Ty
< L: case LI. Subgoal 1.2: Variables: Ty V TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false L1 : lookup [("head", HV), ("tail", TV)] "head" V ============================ valueType V Ty
< L: case L1. Subgoal 1.2.1: Variables: Ty V TV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType NV boolTy VT1 : valueType V Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false ============================ valueType V Ty
< search. Subgoal 1.2.2: Variables: Ty V TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false L1 : "head" = "head" -> false L2 : lookup [("tail", TV)] "head" V ============================ valueType V Ty
< apply L1 to _. Subgoal 2: Variables: Ty I V I1 Tl Fields IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty VT : valueType (recVal Fields) (listTy Ty) LI : I - 1 = I1 LI1 : lookup Fields "tail" Tl LI2 : listIndex Tl I1 V * ============================ valueType V Ty
< VT: case VT. Subgoal 2.1: Variables: Ty I V I1 Tl V1 IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI1 : lookup [("null", V1)] "tail" Tl LI2 : listIndex Tl I1 V * VT : valueType V1 boolTy ============================ valueType V Ty
< L: case LI1. Subgoal 2.1: Variables: Ty I V I1 Tl V1 IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType V1 boolTy L : "null" = "tail" -> false L1 : lookup [] "tail" Tl ============================ valueType V Ty
< case L1. Subgoal 2.2: Variables: Ty I V I1 Tl TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) ============================ valueType V Ty
< L: case LI1. Subgoal 2.2: Variables: Ty I V I1 Tl TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : lookup [("head", HV), ("tail", TV)] "tail" Tl ============================ valueType V Ty
< L: case L1. Subgoal 2.2: Variables: Ty I V I1 Tl TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : lookup [("tail", TV)] "tail" Tl ============================ valueType V Ty
< L: case L2. Subgoal 2.2.1: Variables: Ty I V I1 Tl HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false ============================ valueType V Ty
< apply IH to _ LI2. Subgoal 2.2.1: Variables: Ty I V I1 Tl HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.2.2: Variables: Ty I V I1 Tl TV HV NV IH : forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty LI : I - 1 = I1 LI2 : listIndex Tl I1 V * VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : "tail" = "tail" -> false L3 : lookup [] "tail" Tl ============================ valueType V Ty
< apply L2 to _. Proof completed.
< Theorem updateListIndex_typePres : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out -> valueType Out (listTy Ty). ============================ forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out -> valueType Out (listTy Ty)
< induction on 3. IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) ============================ forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out @ -> valueType Out (listTy Ty)
< intros VTL VTV ULI. Variables: L Ty I V Out IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType L (listTy Ty) VTV : valueType V Ty ULI : updateListIndex L I V Out @ ============================ valueType Out (listTy Ty)
< ULI: case ULI. Subgoal 1: Variables: Ty V NewFields Fields IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType (recVal Fields) (listTy Ty) VTV : valueType V Ty ULI : lookup Fields "null" falseVal ULI1 : replaceRecVal "head" V Fields NewFields ============================ valueType (recVal NewFields) (listTy Ty)
< VTL: case VTL. Subgoal 1.1: Variables: Ty V NewFields V1 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", V1)] "null" falseVal ULI1 : replaceRecVal "head" V [("null", V1)] NewFields VTL : valueType V1 boolTy ============================ valueType (recVal NewFields) (listTy Ty)
< R: case ULI1. Subgoal 1.1: Variables: Ty V V1 RRest IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", V1)] "null" falseVal VTL : valueType V1 boolTy R : "head" = "null" -> false R1 : replaceRecVal "head" V [] RRest ============================ valueType (recVal (("null", V1)::RRest)) (listTy Ty)
< case R1. Subgoal 1.2: Variables: Ty V NewFields TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal ULI1 : replaceRecVal "head" V [("null", NV), ("head", HV), ("tail", TV)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) ============================ valueType (recVal NewFields) (listTy Ty)
< R: case ULI1. Subgoal 1.2: Variables: Ty V TV HV NV RRest IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) R : "head" = "null" -> false R1 : replaceRecVal "head" V [("head", HV), ("tail", TV)] RRest ============================ valueType (recVal (("null", NV)::RRest)) (listTy Ty)
< R: case R1. Subgoal 1.2.1: Variables: Ty V TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) R : "head" = "null" -> false ============================ valueType (recVal [("null", NV), ("head", V), ("tail", TV)]) (listTy Ty)
< search. Subgoal 1.2.2: Variables: Ty V TV HV NV RRest1 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) R : "head" = "null" -> false R1 : "head" = "head" -> false R2 : replaceRecVal "head" V [("tail", TV)] RRest1 ============================ valueType (recVal (("null", NV)::(("head", HV)::RRest1))) (listTy Ty)
< apply R1 to _. Subgoal 2: Variables: Ty I V I1 Tl TlNew NewFields Fields IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType (recVal Fields) (listTy Ty) VTV : valueType V Ty ULI : lookup Fields "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup Fields "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew Fields NewFields ============================ valueType (recVal NewFields) (listTy Ty)
< VTL: case VTL. Subgoal 2.1: Variables: Ty I V I1 Tl TlNew NewFields V1 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", V1)] "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup [("null", V1)] "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", V1)] NewFields VTL : valueType V1 boolTy ============================ valueType (recVal NewFields) (listTy Ty)
< L: case ULI2. Subgoal 2.1: Variables: Ty I V I1 Tl TlNew NewFields V1 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", V1)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", V1)] NewFields VTL : valueType V1 boolTy L : "null" = "tail" -> false L1 : lookup [] "tail" Tl ============================ valueType (recVal NewFields) (listTy Ty)
< case L1. Subgoal 2.2: Variables: Ty I V I1 Tl TlNew NewFields TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal ULI1 : I - 1 = I1 ULI2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) ============================ valueType (recVal NewFields) (listTy Ty)
< L: case ULI2. Subgoal 2.2: Variables: Ty I V I1 Tl TlNew NewFields TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : lookup [("head", HV), ("tail", TV)] "tail" Tl ============================ valueType (recVal NewFields) (listTy Ty)
< L: case L1. Subgoal 2.2: Variables: Ty I V I1 Tl TlNew NewFields TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : lookup [("tail", TV)] "tail" Tl ============================ valueType (recVal NewFields) (listTy Ty)
< L: case L2. Subgoal 2.2.1: Variables: Ty I V I1 Tl TlNew NewFields HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", Tl)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false ============================ valueType (recVal NewFields) (listTy Ty)
< apply IH to _ _ ULI3. Subgoal 2.2.1: Variables: Ty I V I1 Tl TlNew NewFields HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", Tl)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType TlNew (listTy Ty) ============================ valueType (recVal NewFields) (listTy Ty)
< R: case ULI4. Subgoal 2.2.1: Variables: Ty I V I1 Tl TlNew HV NV RRest IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType TlNew (listTy Ty) R : "tail" = "null" -> false R1 : replaceRecVal "tail" TlNew [("head", HV), ("tail", Tl)] RRest ============================ valueType (recVal (("null", NV)::RRest)) (listTy Ty)
< R: case R1. Subgoal 2.2.1: Variables: Ty I V I1 Tl TlNew HV NV RRest1 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType TlNew (listTy Ty) R : "tail" = "null" -> false R1 : "tail" = "head" -> false R2 : replaceRecVal "tail" TlNew [("tail", Tl)] RRest1 ============================ valueType (recVal (("null", NV)::(("head", HV)::RRest1))) (listTy Ty)
< R: case R2. Subgoal 2.2.1.1: Variables: Ty I V I1 Tl TlNew HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType TlNew (listTy Ty) R : "tail" = "null" -> false R1 : "tail" = "head" -> false ============================ valueType (recVal [("null", NV), ("head", HV), ("tail", TlNew)]) (listTy Ty)
< search. Subgoal 2.2.1.2: Variables: Ty I V I1 Tl TlNew HV NV RRest2 IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType Tl (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false H1 : valueType TlNew (listTy Ty) R : "tail" = "null" -> false R1 : "tail" = "head" -> false R2 : "tail" = "tail" -> false R3 : replaceRecVal "tail" TlNew [] RRest2 ============================ valueType (recVal (("null", NV)::(("head", HV)::(("tail", Tl)::RRest2)))) (listTy Ty)
< apply R2 to _. Subgoal 2.2.2: Variables: Ty I V I1 Tl TlNew NewFields TV HV NV IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal ULI1 : I - 1 = I1 ULI3 : updateListIndex Tl I1 V TlNew * ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields VTL : valueType NV boolTy VTL1 : valueType HV Ty VTL2 : valueType TV (listTy Ty) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : "tail" = "tail" -> false L3 : lookup [] "tail" Tl ============================ valueType (recVal NewFields) (listTy Ty)
< apply L2 to _. Proof completed.
< Prove exactEval:host:evalExpr_typePres_ctx, exactEval:host:evalExpr_typePres, exactEval:host:evalStmt_typePres, exactEval:host:evalArgs_typePres_Ctx, exactEval:host:evalArgs_typePres, exactEval:host:evalRecFields_typePres_Ctx, exactEval:host:evalRecFields_typePres with iterateList_typePres : forall V X Body FT ET Ty Sc ET' FE EE EE' O, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> IsET : is_list (is_list (is_pair is_string is_typ)) ET -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> VTy : valueType V (listTy Ty) -> IsTy : is_typ Ty -> IL : iterateList FE EE V X Body EE' O -> Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> Ctxs : related_all_scopes ET EE -> related_all_scopes ET' EE' on IL as IH_IL. Subgoal 1.27: Variables: FT ET Ty FE EE' Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (nil Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (nil Ty1) Ty Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (cons E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (cons E1 E2) Ty Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (cons E1 E2) Ty Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (head E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (head E1) Ty Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (head E1) Ty Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.30: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (tail E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (tail E1) Ty Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.30: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (tail E1) Ty Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.30: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.30: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.31: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (null E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (null E1) Ty Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.31: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (null E1) Ty Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.31: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.31: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (index L I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (index L I) Ty Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (index L I) Ty Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy H3 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 1.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.33: Variables: FT ET Ty FE EE EE' O V1 I E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (exactEval:list:length E1) Ty Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.33: Variables: FT ET Ty FE EE EE' O V1 I E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (exactEval:list:length E1) Ty Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.33: Variables: FT ET FE EE EE' O V1 I E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.33: Variables: FT ET FE EE EE' O V1 I E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) H2 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 2.27: Variables: FT ET Ty FE EE' Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (nil Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : typeOf FT ET (nil Ty1) Ty Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (recVal [("null", trueVal)]) Ty
< case Ty. Subgoal 2.27: Variables: FT ET FE EE' Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (nil Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE' ============================ valueType (recVal [("null", trueVal)]) (listTy Ty1)
< search. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (cons E1 E2) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (cons E1 E2) Ty Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Ty
< case IsE. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (cons E1 E2) Ty Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Ty
< Ty: case Ty. Subgoal 2.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
< apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : valueType V1 Ty1 ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
< apply IH_T_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 2.28: Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 Ty : typeOf FT ET E1 Ty1 Ty1 : typeOf FT ET E2 (listTy Ty1) H3 : related_all_scopes ET EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : valueType V1 Ty1 H6 : valueType V2 (listTy Ty1) ============================ valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
< search. Subgoal 2.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (head E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (head E1) Ty Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ valueType V Ty
< case IsE. Subgoal 2.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (head E1) Ty Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) ============================ valueType V Ty
< VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.29: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType (recVal Fields) (listTy Ty) ============================ valueType V Ty
< VT: case VT. Subgoal 2.29.1: Variables: FT ET Ty FE EE EE' O V E1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * Ev2 : lookup [("null", V1)] "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType V1 boolTy ============================ valueType V Ty
< L: case Ev2. Subgoal 2.29.1: Variables: FT ET Ty FE EE EE' O V E1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType V1 boolTy L : "null" = "head" -> false L1 : lookup [] "head" V ============================ valueType V Ty
< case L1. Subgoal 2.29.2: Variables: FT ET Ty FE EE EE' O V E1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) ============================ valueType V Ty
< L: case Ev2. Subgoal 2.29.2: Variables: FT ET Ty FE EE EE' O V E1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false L1 : lookup [("head", HV), ("tail", TV)] "head" V ============================ valueType V Ty
< L: case L1. Subgoal 2.29.2.1: Variables: FT ET Ty FE EE EE' O V E1 TV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", V), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType NV boolTy VT1 : valueType V Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false ============================ valueType V Ty
< search. Subgoal 2.29.2.2: Variables: FT ET Ty FE EE EE' O V E1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty) VT : valueType NV boolTy VT1 : valueType HV Ty VT2 : valueType TV (listTy Ty) L : "null" = "head" -> false L1 : "head" = "head" -> false L2 : lookup [("tail", TV)] "head" V ============================ valueType V Ty
< apply L1 to _. Subgoal 2.30: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (tail E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (tail E1) Ty Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ valueType V Ty
< case IsE. Subgoal 2.30: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (tail E1) Ty Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.30: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) ============================ valueType V (listTy Ty1)
< VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.30: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType (recVal Fields) (listTy Ty1) ============================ valueType V (listTy Ty1)
< VT: case VT. Subgoal 2.30.1: Variables: FT ET FE EE EE' O V E1 Ty1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * Ev2 : lookup [("null", V1)] "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V1 boolTy ============================ valueType V (listTy Ty1)
< L: case Ev2. Subgoal 2.30.1: Variables: FT ET FE EE EE' O V E1 Ty1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V1 boolTy L : "null" = "tail" -> false L1 : lookup [] "tail" V ============================ valueType V (listTy Ty1)
< case L1. Subgoal 2.30.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) ============================ valueType V (listTy Ty1)
< L: case Ev2. Subgoal 2.30.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) L : "null" = "tail" -> false L1 : lookup [("head", HV), ("tail", TV)] "tail" V ============================ valueType V (listTy Ty1)
< L: case L1. Subgoal 2.30.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : lookup [("tail", TV)] "tail" V ============================ valueType V (listTy Ty1)
< L: case L2. Subgoal 2.30.2.1: Variables: FT ET FE EE EE' O V E1 Ty1 HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", V)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType V (listTy Ty1) L : "null" = "tail" -> false L1 : "head" = "tail" -> false ============================ valueType V (listTy Ty1)
< search. Subgoal 2.30.2.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) L : "null" = "tail" -> false L1 : "head" = "tail" -> false L2 : "tail" = "tail" -> false L3 : lookup [] "tail" V ============================ valueType V (listTy Ty1)
< apply L2 to _. Subgoal 2.31: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (null E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (null E1) Ty Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ valueType V Ty
< case IsE. Subgoal 2.31: Variables: FT ET Ty FE EE EE' O V Fields E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (null E1) Ty Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.31: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) ============================ valueType V boolTy
< VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.31: Variables: FT ET FE EE EE' O V Fields E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType (recVal Fields) (listTy Ty1) ============================ valueType V boolTy
< VT: case VT. Subgoal 2.31.1: Variables: FT ET FE EE EE' O V E1 Ty1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * Ev2 : lookup [("null", V1)] "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V1 boolTy ============================ valueType V boolTy
< L: case Ev2. Subgoal 2.31.1.1: Variables: FT ET FE EE EE' O V E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V boolTy ============================ valueType V boolTy
< search. Subgoal 2.31.1.2: Variables: FT ET FE EE EE' O V E1 Ty1 V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V1 boolTy L : "null" = "null" -> false L1 : lookup [] "null" V ============================ valueType V boolTy
< apply L to _. Subgoal 2.31.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" V H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) ============================ valueType V boolTy
< L: case Ev2. Subgoal 2.31.2.1: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", V), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType V boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) ============================ valueType V boolTy
< search. Subgoal 2.31.2.2: Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O * H1 : is_expr E1 Ty : typeOf FT ET E1 (listTy Ty1) VT : valueType NV boolTy VT1 : valueType HV Ty1 VT2 : valueType TV (listTy Ty1) L : "null" = "null" -> false L1 : lookup [("head", HV), ("tail", TV)] "null" V ============================ valueType V boolTy
< apply L to _. Subgoal 2.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (index L I) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (index L I) Ty Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ valueType V Ty
< case IsE. Subgoal 2.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (index L I) Ty Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy ============================ valueType V Ty
< apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 2.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy H3 : valueType LV (listTy Ty) ============================ valueType V Ty
< apply listIndex_typePres to _ Ev3. Subgoal 2.32: Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I Ty : typeOf FT ET L (listTy Ty) Ty1 : typeOf FT ET I intTy H3 : valueType LV (listTy Ty) H4 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.33: Variables: FT ET Ty FE EE EE' O V1 I E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (exactEval:list:length E1) Ty Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ valueType (intVal I) Ty
< case Ty. Subgoal 2.33: Variables: FT ET FE EE EE' O V1 I E1 Ty1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsE : is_expr (exactEval:list:length E1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : typeOf FT ET E1 (listTy Ty1) ============================ valueType (intVal I) intTy
< search. Subgoal 3.15: Variables: FT ET ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsS : is_stmt (listUpdate L I E) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (listUpdate L I E) ET' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.15: Variables: FT ET ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (listUpdate L I E) ET' Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ related_all_scopes ET' EE'
< Ctxs': apply IH_C_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 ============================ related_all_scopes ET' EE'
< apply IH_T_E to _ _ _ _ _ _ Ev2 _ _. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 H6 : valueType V Ty ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev2. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 H6 : valueType V Ty H7 : is_list (is_list (is_pair is_string is_value)) EE4 ============================ related_all_scopes ET' EE'
< apply related_all_scopes_lookupScopes to Ctxs' Ty Ev3. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 H6 : valueType V Ty H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : valueType LV (listTy Ty) ============================ related_all_scopes ET' EE'
< apply updateListIndex_typePres to _ _ Ev4. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 H6 : valueType V Ty H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : valueType LV (listTy Ty) H9 : valueType LV2 (listTy Ty) ============================ related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ _ Ev5 _ _. Subgoal 3.15: Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E Ty : lookupScopes L ET' (listTy Ty) Ty1 : typeOf FT ET' I intTy Ty2 : typeOf FT ET' E Ty H4 : related_all_scopes ET' EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 Ctxs' : related_all_scopes ET' EE4 H6 : valueType V Ty H7 : is_list (is_list (is_pair is_string is_value)) EE4 H8 : valueType LV (listTy Ty) H9 : valueType LV2 (listTy Ty) H10 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 3.16: Variables: FT ET ET' FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsS : is_stmt (listForeach X L Body) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (listForeach X L Body) ET' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.16: Variables: FT ET ET' FE EE EE' O LV EE3 O2 O3 Body L X IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (listForeach X L Body) ET' Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1 ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1 H4 : related_all_scopes ET' EE3 ============================ related_all_scopes ET' EE'
< IsLTy: apply typeOf_isTy to _ _ _ Ty. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1 H4 : related_all_scopes ET' EE3 IsLTy : is_typ (listTy Ty) ============================ related_all_scopes ET' EE'
< case IsLTy. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1 H4 : related_all_scopes ET' EE3 H5 : is_typ Ty ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty1. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET') H4 : related_all_scopes ET' EE3 H5 : is_typ Ty ============================ related_all_scopes ET' EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET') H4 : related_all_scopes ET' EE3 H5 : is_typ Ty H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET' EE'
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET') H4 : related_all_scopes ET' EE3 H5 : is_typ Ty H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : is_value LV ============================ related_all_scopes ET' EE'
< apply IH_T_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET') H4 : related_all_scopes ET' EE3 H5 : is_typ Ty H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : is_value LV H8 : valueType LV (listTy Ty) ============================ related_all_scopes ET' EE'
< apply IH_IL to _ _ _ _ _ _ _ Ty1 _ _ Ev2 _ _. Subgoal 3.16: Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body Ty : typeOf FT ET' L (listTy Ty) Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET') H4 : related_all_scopes ET' EE3 H5 : is_typ Ty H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : is_value LV H8 : valueType LV (listTy Ty) H9 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Subgoal 8.1: Variables: X Body FT ET Ty Sc ET' FE EE' Fields IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE' IL1 : lookup Fields "null" trueVal ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty. Subgoal 8.1: Variables: X Body FT ET Ty FE EE' Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE' IL1 : lookup Fields "null" trueVal ============================ related_all_scopes ET EE'
< search. Subgoal 8.2: Variables: X Body FT ET Ty Sc ET' FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsV. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ related_all_scopes ET EE'
< apply lookup_is_value to _ IL2. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ related_all_scopes ET EE'
< apply lookup_is_value to _ IL4. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ related_all_scopes ET EE'
< And: assert valueType Hd Ty /\ valueType Tl (listTy Ty). Subgoal 8.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ valueType Hd Ty /\ valueType Tl (listTy Ty)
< VTy: case VTy. Subgoal 8.2.1.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", V1)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", V1)] "null" falseVal IL2 : lookup [("null", V1)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", V1)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", V1)] H2 : is_value Hd H3 : is_value Tl VTy : valueType V1 boolTy ============================ valueType Hd Ty /\ valueType Tl (listTy Ty)
< L: case IL4. Subgoal 8.2.1.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' V1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", V1)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", V1)] "null" falseVal IL2 : lookup [("null", V1)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", V1)] H2 : is_value Hd H3 : is_value Tl VTy : valueType V1 boolTy L : "null" = "tail" -> false L1 : lookup [] "tail" Tl ============================ valueType Hd Ty /\ valueType Tl (listTy Ty)
< case L1. Subgoal 8.2.1.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) ============================ valueType Hd Ty /\ valueType Tl (listTy Ty)
< split. Subgoal 8.2.1.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) ============================ valueType Hd Ty
< LH: case IL2. Subgoal 8.2.1.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) LH : "null" = "head" -> false LH1 : lookup [("head", HV), ("tail", TV)] "head" Hd ============================ valueType Hd Ty
< LH: case LH1. Subgoal 8.2.1.2.1.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", Hd), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", Hd), ("tail", TV)] "null" falseVal IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", Hd), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", Hd), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType Hd Ty VTy2 : valueType TV (listTy Ty) LH : "null" = "head" -> false ============================ valueType Hd Ty
< search. Subgoal 8.2.1.2.1.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) LH : "null" = "head" -> false LH1 : "head" = "head" -> false LH2 : lookup [("tail", TV)] "head" Hd ============================ valueType Hd Ty
< apply LH1 to _. Subgoal 8.2.1.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) ============================ valueType Tl (listTy Ty)
< LT: case IL4. Subgoal 8.2.1.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) LT : "null" = "tail" -> false LT1 : lookup [("head", HV), ("tail", TV)] "tail" Tl ============================ valueType Tl (listTy Ty)
< LT: case LT1. Subgoal 8.2.1.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) LT : "null" = "tail" -> false LT1 : "head" = "tail" -> false LT2 : lookup [("tail", TV)] "tail" Tl ============================ valueType Tl (listTy Ty)
< LT: case LT2. Subgoal 8.2.1.2.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", Tl)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", Tl)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", Tl)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType Tl (listTy Ty) LT : "null" = "tail" -> false LT1 : "head" = "tail" -> false ============================ valueType Tl (listTy Ty)
< search. Subgoal 8.2.1.2.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) IsTy : is_typ Ty IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)] H2 : is_value Hd H3 : is_value Tl VTy : valueType NV boolTy VTy1 : valueType HV Ty VTy2 : valueType TV (listTy Ty) LT : "null" = "tail" -> false LT1 : "head" = "tail" -> false LT2 : "tail" = "tail" -> false LT3 : lookup [] "tail" Tl ============================ valueType Tl (listTy Ty)
< case LT3. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl And : valueType Hd Ty /\ valueType Tl (listTy Ty) ============================ related_all_scopes ET EE'
< case And. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) ============================ related_all_scopes ET EE'
< assert related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE). Subgoal 8.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) ============================ related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
< unfold . Subgoal 8.2.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) ============================ forall X1 T, lookup [(X, Ty)] X1 T -> exists V, lookup [(X, Hd)] X1 V /\ valueType V T
< intros L. Subgoal 8.2.2.1: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) L : lookup [(X, Ty)] X1 T ============================ exists V, lookup [(X, Hd)] X1 V /\ valueType V T
< L: case L. Subgoal 8.2.2.1.1: Variables: Body FT ET FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X1 IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X1, T)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy T) IsTy : is_typ T IL : iterateList FE EE (recVal Fields) X1 Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X1, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X1 Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd T H5 : valueType Tl (listTy T) ============================ exists V, lookup [(X1, Hd)] X1 V /\ valueType V T
< search. Subgoal 8.2.2.1.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) L : X = X1 -> false L1 : lookup [] X1 T ============================ exists V, lookup [(X, Hd)] X1 V /\ valueType V T
< case L1. Subgoal 8.2.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) ============================ forall X1, no_lookup [(X, Ty)] X1 -> no_lookup [(X, Hd)] X1
< intros NL. Subgoal 8.2.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) NL : no_lookup [(X, Ty)] X1 ============================ no_lookup [(X, Hd)] X1
< case NL. Subgoal 8.2.2.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : X = X1 -> false H7 : no_lookup [] X1 ============================ no_lookup [(X, Hd)] X1
< search. Subgoal 8.2.2.3: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) ============================ related_all_scopes ET EE
< search. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) ============================ related_all_scopes ET EE'
< Ctxs': apply IH_C_S to _ _ _ _ _ Ty IL3 _ _. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) Ctxs' : related_all_scopes (Scope'::ET) (Scope::EE3) ============================ related_all_scopes ET EE'
< case Ctxs'. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) H7 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H8 : forall X, no_lookup Scope' X -> no_lookup Scope X H9 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< IsEE3+: apply evalStmt_isCtx to _ _ _ IL3. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) H7 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H8 : forall X, no_lookup Scope' X -> no_lookup Scope X H9 : related_all_scopes ET EE3 IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ related_all_scopes ET EE'
< case IsEE3+. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) H7 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H8 : forall X, no_lookup Scope' X -> no_lookup Scope X H9 : related_all_scopes ET EE3 H10 : is_list (is_pair is_string is_value) Scope H11 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_IL to _ _ _ _ _ _ _ Ty _ _ IL5 _ _. Subgoal 8.2: Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') -> valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * -> (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IsX : is_string X IsBody : is_stmt Body IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET) VTy : valueType (recVal Fields) (listTy Ty) IsTy : is_typ Ty IL : iterateList FE EE (recVal Fields) X Body EE' O @ Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv' Ctxs : related_all_scopes ET EE IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : valueType Hd Ty H5 : valueType Tl (listTy Ty) H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE) H7 : forall X T, lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T H8 : forall X, no_lookup Scope' X -> no_lookup Scope X H9 : related_all_scopes ET EE3 H10 : is_list (is_pair is_string is_value) Scope H11 : is_list (is_list (is_pair is_string is_value)) EE3 H12 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Proof completed.
< Prove exactEval:host:paramTy_paramName_same. Proof completed.
< Prove exactEval:host:funOK_getFunEvalInfo_related. Proof completed.
< Prove exactEval:host:evalExpr_output_forms, exactEval:host:evalStmt_output_forms, exactEval:host:evalArgs_output_forms, exactEval:host:evalRecFields_output_forms with iterateList_output_forms : forall V X Body FE EE EE' O, IsV : is_value V -> IsX : is_string X -> IsBody : is_stmt Body -> IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> IsEE : is_list (is_list (is_pair is_string is_value)) EE -> IL : iterateList FE EE V X Body EE' O -> output_forms O on IL as IH_IL. Subgoal 1.27: Variables: FE EE' Ty IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @ ============================ output_forms []
< search. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.28: Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE3 O2 * Ev2 : evalExpr FE EE3 E2 V2 EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V ============================ output_forms O
< case IsE. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.29: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "head" V H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V ============================ output_forms O
< case IsE. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.30: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "tail" V H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V ============================ output_forms O
< case IsE. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.31: Variables: FE EE V EE' O Fields E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V EE' O @ Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O * Ev2 : lookup Fields "null" V H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (index L I) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev4. Subgoal 1.32: Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (index L I) V EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 * Ev3 : listIndex LV Idx V Ev4 : O2 ++ O3 = O H1 : is_expr L H2 : is_expr I H3 : output_forms O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : output_forms O3 H6 : output_forms O ============================ output_forms O
< search. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsE : is_expr (exactEval:list:length E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I ============================ output_forms O
< case IsE. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.33: Variables: FE EE EE' O V1 I E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @ Ev1 : evalExpr FE EE E1 V1 EE' O * Ev2 : listLength V1 I H1 : is_expr E1 H2 : output_forms O ============================ output_forms O
< search. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev6. Subgoal 2.15: Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : evalExpr FE EE I (intVal N) EE2 O2 * Ev2 : evalExpr FE EE2 E V EE4 O3 * Ev3 : lookupScopes L EE4 LV Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE4 EE' Ev6 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE2 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value LV ============================ output_forms O
< apply IH_IL to _ _ _ _ _ Ev2. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value LV H7 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 2.16: Variables: FE EE EE' O LV EE3 O2 O3 Body L X IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV EE3 O2 * Ev2 : iterateList FE EE3 LV X Body EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_string X H2 : is_expr L H3 : is_stmt Body H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : is_value LV H7 : output_forms O3 H8 : output_forms O ============================ output_forms O
< search. Subgoal 5.1: Variables: X Body FE EE' Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE' IL : iterateList FE EE' (recVal Fields) X Body EE' [] @ IL1 : lookup Fields "null" trueVal ============================ output_forms []
< search. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsV : is_value (recVal Fields) IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O ============================ output_forms O
< case IsV. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields ============================ output_forms O
< apply lookup_is_value to _ IL2. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd ============================ output_forms O
< apply lookup_is_value to _ IL4. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl ============================ output_forms O
< apply IH_S to _ _ _ IL3. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : output_forms O2 ============================ output_forms O
< IsEE3+: apply evalStmt_isCtx to _ _ _ IL3. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : output_forms O2 IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3) ============================ output_forms O
< case IsEE3+. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : output_forms O2 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_IL to _ _ _ _ _ IL5. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : output_forms O2 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ IL6. Subgoal 5.2: Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IH_IL : forall V X Body FE EE EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> output_forms O IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (recVal Fields) X Body EE' O @ IL1 : lookup Fields "null" falseVal IL2 : lookup Fields "head" Hd IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 * IL4 : lookup Fields "tail" Tl IL5 : iterateList FE EE3 Tl X Body EE' O3 * IL6 : O2 ++ O3 = O H1 : is_list (is_pair is_string is_value) Fields H2 : is_value Hd H3 : is_value Tl H4 : output_forms O2 H5 : is_list (is_pair is_string is_value) Scope H6 : is_list (is_list (is_pair is_string is_value)) EE3 H7 : output_forms O3 H8 : output_forms O ============================ output_forms O
< search. Proof completed.
< Prove exactEval:host:evalProgram_output_forms. Proof completed.
< Prove exactEval:host:paramName_exists. Proof completed.
< Prove exactEval:host:getFunEvalInfo_exists. Proof completed.